Ich habe 50 Ordner mit einigen Unterordnern, mit insgesamt mehr als 1000 Audiodateien. Ich muss alle Unterordner entfernen und alle Dateien auf die aktuelle Ebene bringen. Versucht, mv */* ./
aber es beschwert sich: Argumentliste zu lang
Ich habe 50 Ordner mit einigen Unterordnern, mit insgesamt mehr als 1000 Audiodateien. Ich muss alle Unterordner entfernen und alle Dateien auf die aktuelle Ebene bringen. Versucht, mv */* ./
aber es beschwert sich: Argumentliste zu lang
Antworten:
Ich gehe davon aus, dass Ihre Audiodateierweiterung .mp3 ist
find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +
Ersetzen Sie .mp3
durch die Erweiterung Ihrer Audiodateien
Ersetzen Sie <AudioParentFolderPath>
durch den übergeordneten Ordner, der Ihre Unterordner enthält.
Ersetzen Sie ihn <YourTargetFolder>
durch den Ordnerpfad, in den Sie alle Dateien ablegen möchten .
Wenn zwei Dateien aus verschiedenen Unterordnern denselben Namen haben, wird nur eine verschoben.
Bearbeiten: Wie Costas sagte: "Der -i
Schalter macht mv
interaktiv, er wird aufgefordert, bevor vorhandene Dateien überschrieben werden."
-t
erlauben Sie, zuerst das Ziel anzugeben. von der mv
Handbuchseite: -t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
find . -type f -mindepth 2 -exec mv -t ./ {} +
Beachten Sie, dass dieser Befehl alle Dateien mit demselben Namen überschreibt. Sie können dies verwenden, um vor dem Überschreiben aufgefordert zu werden:
find . -type f -mindepth 2 -exec mv -it ./ {} +
-type f
: finde nur reguläre Dateien.-mindepth 2
: finde nur Dateien in Unterverzeichnissen.-exec mv -it ./ {}
: -exec
bedeutet "diesen Befehl für jede gefundene Datei ausführen ". Das {}
wird durch die Dateinamen ersetzt. Der -i
Switch macht mv
interaktiv, fordert vor dem Überschreiben vorhandener Dateien auf und -t
setzt das Zielverzeichnis auf ./
.+
: (In einem Argument Zeile) setzen Dateien zusammen können so viele wie Shell mit betreiben Befehl aufzurufen Befehl Mindestzeiten (nicht eins nach dem anderen , sondern eine bis mehrere).In Bezug auf weitere Löschungen leerer Ordner können Sie dasselbe Rezept verwenden:
find . -type d -empty -delete
-type f
Wählt nur einfache Dateien aus, ausgenommen symbolische Links, Named Pipes und dergleichen. Sie können alle Dateien außer Verzeichnissen verschieben ! -type d
.
-L
Parameter
-i
ist Standard, -t
ist nur GNU (nichts mit Linux zu tun, das nur ein Kernel ist, der in einigen GNU- und Nicht-GNU-Systemen zu finden ist)
-t
existiert auf einigen Systemen nicht (wie einem nicht so alten AIX)
find . -type f -mindepth 2 -exec mv {} ./ \;
Ja, dies ist eine Begrenzung der kumulierten Größe von Argumenten und Umgebungen, die execve()
beim Ausführen eines externen Befehls an den Systemaufruf übergeben werden.
Mit zsh
können Sie mv
stattdessen das eingebaute verwenden:
zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .
Oder verwenden Sie zargs
, um die Liste in überschaubare Teile zu unterteilen:
autoload zargs
zargs -Ifiles ./*/* -- mv files .
Mit ksh93
:
command -x mv ./*/* .
Mit GNU xargs
und mit GNU mv
mit einer Shell, in printf
die eingebaut ist (die meisten mksh
sind die bemerkenswerte Ausnahme):
printf '%s\0' ./*/* | xargs -r0 mv -t .
zsh
Fall, dass Sie einige Glob-Qualifikationsmerkmale setzen können , z . B. (.)
oder (^/)
nach dem letzten *
.
Eine ziemlich tragbare Lösung könnte sein:
Suchen Sie alle Dateien in jedem Unterordner und verschieben Sie sie in das aktuelle Verzeichnis
find ./*/ -type f -print | xargs mv -i "{}" ./
Sie können ein | egrep "\.au$|\.mp3$|\.ac3$"
Dazwischen hinzufügen, um sicherzustellen, dass es sich bei den gefundenen Dateien um Dateien mit einer Audioerweiterung handelt (fügen Sie so viele Erweiterungen hinzu, wie für alle Typen erforderlich sind. Ich stelle nur drei häufig verwendete Dateien zur Verfügung.)
find
überhaupt nicht anrufen . Gerade genug echo
oderprintf
find
lösen Sie das Problem nicht, sondern xargs
tun Sie es.
t
könnte für "Ziel" sein?