Wie kann ich mithilfe der Shell nach Dateien in allen Unterverzeichnissen suchen und diese Dateien dann kopieren?

8

Wie finde ich nur die * .mp3-Dateien mit einem rekursiven Befehl wie ls -R *.mp3in einem Verzeichnis, das mehrere Unterverzeichnisse enthält, und kopiere diese Dateien am Ende in ein von mir ausgewähltes Verzeichnis.

Danke für deine Unterstützung.

V 3 L 3 N 0
quelle

Antworten:

14

Der Befehl lautet:

find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;

Alternative:

find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/

Beispiel:

alex@MaD-pc:~/test$ ls
1  2  3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt  2.mp3  3.txt

2:
4.txt  5.mp3  6.txt

3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3  5.mp3

Für mehr Informationen:

man find
Hytromo
quelle
Die Richter würden auch akzeptieren:find /path/to/dir/ -name '*.c' | xargs cp -t /target/
Oli
Ich bin einer der Richter und ich lehne diese Lösung ab 8-) Danke für den Kommentar, ich werde ihn hinzufügen :)
Hytromo
1
xargsist normalerweise viel schneller. Ich habe gerade einen kurzen Test hier durchgeführt, um eine Ladung von c-Dateien zu finden und sie auszuführen ls -l. Es ist 0m2.420s für xargsund 0m25.494s für -exec... Natürlich wird die cpOperation in diesem Fall die meiste Zeit dauern, also spielt es wahrscheinlich keine Rolle, aber es lohnt sich, darauf zu achten.
Oli
Ich würde empfehlen, den -n`` switch to the Befehl cp` hinzuzufügen , um ein Überschreiben bei doppelten Namen zu vermeiden (oder ein Skript zu schreiben, das nach Duplikaten sucht, bevor das Ziel kopiert und nach Bedarf umbenannt wird)
Elder Geek
2

Es gibt auch einen anderen Weg, der meiner Meinung nach perfekt zu Ihrem Zweck passt. Sie können kombinieren findmit einer whileSchleife und nicht einmal verwenden müssen entweder von execoder xargsüberhaupt nicht . Wenn Sie beispielsweise Ihre Datei mp3saus Ihrem Download-Ordner in Ihren Musikordner kopieren möchten, verwenden Sie das folgende Skript, das ich bereits oft verwendet habe.

Sie können es beliebig ändern, indem Sie die Verzeichnisse ändern, in denen finddie resultierenden Dateien durchsucht und abgelegt werden. Wenn kein Verzeichnis angegeben ist, findwird der gesamte Home-Ordner durchsucht. Sie können auch cpzu mvoder anderen Befehlen wechseln . Es ist ziemlich schnell, da ich es gerade mit 3945 .jpgDateien getestet habe ! Kopieren Sie es in einen Texteditor, speichern Sie es und machen Sie es durch Ausführen ausführbar chmod +x myscript.

#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f; 
do cp -- "$f" ~/Music ;
done

In diesem Bash-Wiki wird gezeigt, wie nützlich es ist, die whileSchleife und die readBefehle zu kombinieren , um die Ausgabe des findBefehls zu verarbeiten. und die Art und Weise, wie ich es gemacht habe, stellt sicher, dass das Skript nicht kaputt geht, wenn es auf Dateinamen mit Leerzeichen oder anderen unerwarteten oder Sonderzeichen stößt.

Weitere allgemeine Informationen zum findBefehl erhalten Sie im Terminal man findoder auf den Ubuntu-Manpages online . Eine gute Einführung in die Verwendung von find finden Sie auch in diesem Artikel .


quelle
ist nicht find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; doneeinfacher?
Steabert
Meine Methode stellt eine bewährte Methode dar und verhindert, dass das Skript beschädigt wird, wie unter dem von mir angegebenen Link angegeben.
ah, ich
verstehe
Ich würde empfehlen, den -n`` switch to the Befehl cp` hinzuzufügen , um ein Überschreiben bei doppelten Namen zu vermeiden (oder ein Skript zu schreiben, das nach Duplikaten sucht, bevor das Ziel kopiert und nach Bedarf umbenannt wird)
Elder Geek