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
quelle
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 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
könnte für "Ziel" sein?-t
erlauben Sie, zuerst das Ziel anzugeben. von dermv
Handbuchseite:-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
Beachten Sie, dass dieser Befehl alle Dateien mit demselben Namen überschreibt. Sie können dies verwenden, um vor dem Überschreiben aufgefordert zu werden:
Erläuterung
-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 machtmv
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:
quelle
-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 Siemv
stattdessen das eingebaute verwenden:Oder verwenden Sie
zargs
, um die Liste in überschaubare Teile zu unterteilen:Mit
ksh93
:Mit GNU
xargs
und mit GNUmv
mit einer Shell, inprintf
die eingebaut ist (die meistenmksh
sind die bemerkenswerte Ausnahme):quelle
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
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.)quelle
find
überhaupt nicht anrufen . Gerade genugecho
oderprintf
find
lösen Sie das Problem nicht, sondernxargs
tun Sie es.