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 .mp3durch 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 -iSchalter macht mvinteraktiv, er wird aufgefordert, bevor vorhandene Dateien überschrieben werden."
-terlauben Sie, zuerst das Ziel anzugeben. von der mvHandbuchseite: -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 ./ {}: -execbedeutet "diesen Befehl für jede gefundene Datei ausführen ". Das {}wird durch die Dateinamen ersetzt. Der -iSwitch macht mvinteraktiv, fordert vor dem Überschreiben vorhandener Dateien auf und -tsetzt 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 fWählt nur einfache Dateien aus, ausgenommen symbolische Links, Named Pipes und dergleichen. Sie können alle Dateien außer Verzeichnissen verschieben ! -type d.
-LParameter
-iist Standard, -tist nur GNU (nichts mit Linux zu tun, das nur ein Kernel ist, der in einigen GNU- und Nicht-GNU-Systemen zu finden ist)
-texistiert 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 zshkönnen Sie mvstattdessen 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 xargsund mit GNU mvmit einer Shell, in printfdie eingebaut ist (die meisten mkshsind die bemerkenswerte Ausnahme):
printf '%s\0' ./*/* | xargs -r0 mv -t .
zshFall, 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 echooderprintf
findlösen Sie das Problem nicht, sondern xargstun Sie es.
tkönnte für "Ziel" sein?