Drei-Stufen-Lösung cd
in ein Verzeichnis, in dem sich die Dateien befinden, und dann:
Dadurch wird jede Datei in das entsprechende Unterverzeichnis verschoben:
find . -maxdepth 1 -type f -iname "* -*.epub" \ -exec bash -c ' mkdir "$" 2>/dev/null; mv -n -- "$1" "$"/ ' bash {} \;
"$"
ist ein Teil von"$1"
bis zum ersten-
(Leerzeichen + Minus). Wir erwarten manchmal, dass das Unterverzeichnis bereits existiert;mkdir
wird dann scheitern, es ist OK.Dadurch werden Unterverzeichnisse mit zwei oder weniger Dateien erkannt und der gesamte Inhalt (zurück) in das aktuelle Arbeitsverzeichnis verschoben:
find . -mindepth 1 -maxdepth 1 -type d \ -exec sh -c ' [ $(find "$1" -maxdepth 1 -type f -printf "\n" | wc -l) -le 2 ] ' sh {} \; \ -exec sh -c ' find "$1" -mindepth 1 -maxdepth 1 -exec mv -n -t ./ -- \{\} + ' sh {} \;
Ändern Sie das
-le 2
Fragment, um die Anzahl anzupassen. Sie fragen sich vielleicht, warum ichfind
Zeilenumbrüche anstelle von Dateinamen drucken soll (Standardverhalten). Das liegt daran, dasswc
es sich um ein Textwerkzeug handelt. Mögliche Zeilenumbrüche in Dateinamen beeinträchtigen meine Logik. Durch das explizite Drucken genau eines Zeilenvorschubs pro Datei wird dieses Problem behoben.Dadurch werden leere Verzeichnisse entfernt:
find . -maxdepth 1 -type d -empty -delete
Es sollte auch ohne funktionieren,
-empty
da-delete
(likermdir
) ein Verzeichnis nur dann löscht, wenn es leer ist. In diesem Fall möchte ich jedoch die erwarteten Fehlermeldungen unterdrücken, die besagen, dass das angegebene Verzeichnis nicht leer ist. Wenn Sie dies mit tun2>/dev/null
, kann ich jedoch auch keine unerwarteten Fehlermeldungen sehen. Daher das-empty
sowieso.
Führen Sie diese Schritt für Schritt aus oder erstellen Sie ein Skript. Es wird empfohlen, die Verzeichnisstruktur vorher zu sichern (z. B. cp -lr my_directory my_directory_backup
), falls dies der Fall ist. Einige Optionen, die ich verwendet habe, sind Nicht-POSIX. Diese funktionieren möglicherweise nicht für Sie. Wenn Sie bereits über Unterverzeichnisse verfügen, werden diese möglicherweise durch meine Lösung beeinträchtigt. Passen Sie es dann an Ihre Bedürfnisse an.