
Ich habe einen Befehl ausgeführt, der anhand bestimmter Suchkriterien viele Dateien findet. Er gibt die Dateien folgendermaßen zurück:
./somepath/somepath/file.something
./asdf/asdf/s.php
./etc/a.php
./a/b/c/d/e/f/g.jpg
Daher habe ich mich gefragt: Wenn ich diese Ausgabe in einer Datei erfasse (also eine Datei pro Zeile), kann mir dann jemand helfen, einen Befehl zu schreiben, der die Datei durchläuft und die Dateien einzeln in ein angegebenes Verzeichnis verschiebt?
Vielen Dank im Voraus.
Antwort1
while read -r filename
do
mv -- "$filename" directory
done < list_of_files.txt
Nicht getestet (ich verwende einen Arbeits-PC mit Windows), sollte aber funktionieren.
Antwort2
your_command | xargs -I% mv "%" dest_dir
Wenn Ihr Befehl lautet find
oder Sie die Dateinamen auf eine andere Weise mit Null beenden können:
your_command | xargs -0 -I% mv "%" dest_dir
oder
find [find-args] -print0 | xargs -0 -I% mv "%" dest_dir
Die Verwendung von Nullen zum Beenden von Dateinamen ermöglicht die Arbeit mit Dateinamen, die Leerzeichen, Zeilenumbrüche usw. enthalten können.
Sie können xargs
Ihre Datei auch folgendermaßen verarbeiten:
xargs -a filename -I% mv "%" dest_dir
Antwort3
Eine weitere Möglichkeit, wenn die Dateinamen keine Leerzeichen enthalten, wäre
mv `search_command_here` dest_directory
(Die Backtick-Syntax ist auch ein Bash-ismus, aber in der Frage wird ausdrücklich darauf hingewiesen, dass dies unter Linux geschieht und alle wichtigen Linux-Distributionen standardmäßig Bash verwenden.)