Wie kann ich Dateien nach Typ rekursiv aus einem Verzeichnis und seinen Unterverzeichnissen in ein anderes Verzeichnis verschieben?

30

Was wäre ein guter Weg, um einen Dateityp aus einem Verzeichnis und all seinen Unterverzeichnissen zu verschieben?

Wie "verschiebe alle * .ogg in / thisdir rekursiv nach / somedir". Ich habe ein paar Dinge ausprobiert; Mein bester Versuch war (immer noch nicht so toll):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

Es wird in jeder Zeile vor jedem Dateinamen zurückgegeben.

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'
Steve Burdine
quelle

Antworten:

23

du kannst find with xargs dafür verwenden

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

Das -I im obigen Befehl teilt xargs mit, welche Ersatzzeichenfolge Sie verwenden möchten (andernfalls werden die Argumente am Ende des Befehls hinzugefügt).

ODER
Versuchen Sie in Ihrem Befehl, '{}' nach dem mvBefehl zu verschieben.

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;

Hemant
quelle
1
Bitte vergessen Sie nicht, eine Sicherungskopie anzulegen, bevor Sie die obigen Befehle ausführen :-).
Hemant
2
Übrigens sollten als erstes -print0 für find und -0 für xargs verwendet werden, um Leerzeichen bei Dateinamenproblemen zu vermeiden.
Maxschlepzig
@maxschlepzig: guter punkt. Ich werde bearbeiten.
Hemant
2
Ich empfehle dringend, mv -ihier zu verwenden, damit Sie nicht riskieren, Dateien zu überschreiben, wenn etwas Unerwartetes passiert.
Gilles 'SO- hör auf böse zu sein'
2
mit mv von gnu core utils kannst du mv -t <targetdir>und + anstelle von \ verwenden;
10
find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

Sie haben die Argumente für mv vertauscht

Coding District
quelle
9

In zsh oder bash 4, um alle *.oggDateien zu sammeln in /somedir:

mv /thisdir/**/*.ogg /somedir

Wenn Sie die Verzeichnishierarchie reproduzieren möchten: (Warnung, direkt in den Browser eingegeben)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir
Gilles 'SO - hör auf böse zu sein'
quelle
darüber hinaus bequem in bash
Mark