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.
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.
Antworten:
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
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.
-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)
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 .
find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; doneeinfacher?
-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)
find /path/to/dir/ -name '*.c' | xargs cp -t /target/