Ich versuche, meine Dateien vom aktuellen Verzeichnis in ein anderes zu verschieben. Das Problem ist, dass mehrere Dateien einen Namen mit Sonderzeichen wie haben space, ü, &, (, ...
. Wie kann ich alle meine Dateien mit einem Befehl wie diesem verschieben: ls | grep mp4 | xargs -i mv {} mp4
, wobei {}
der Name der aktuellen Datei und mp4 als Ziel für alle meine Dateien stehen soll? Ich habe den Befehl ausprobiert, aber er zeigt Fehler an. Können Sie mir bitte helfen?
Antwort1
Genau das ist die SituationSie möchten nicht verwendenls
in. Oder xargs
mit den Standardeinstellungen wird die Eingabe bei Leerzeichen aufgeteilt und Anführungszeichen und Backslashs speziell behandelt. Sie müssen die -0
Eingabe bei Nullbytes oder -d'\n'
bei Zeilenumbrüchen (GNU xargs) trennen, um dieses Verhalten auszuschalten.
Da sich alle Dateien im selben Verzeichnis befinden, können Sie einfach die Shell verwenden:
mv *mp4* mp4/
Oder mv *.mp4 mp4/
wenn Sie nur Dateien meinen, die mp4
die Erweiterung haben. Die erste würde davor warnen, mp4
sich selbst nach zu verschieben mp4
.)
Wenn die Dateien nicht im selben Verzeichnis liegen würden, müssten Sie entweder den Doppelstern verwenden ( zsh
- standardmäßig aktiviert oder ksh
mit set -o globstar
bzw. bash
mit shopt -s globstar
):
mv **/*mp4* mp4/
oderfind
find . -type f -name "*mp*" -exec mv {} mp4/ \;
Antwort2
Der Befehl:
ls | grep mp4 | xargs -i mv {} mp4
kann in den meisten Fällen durch die einfachere und robustere Lösung ersetzt werden:
mv *mp4* mp4
Sie können die Warnung ignorieren, dass das Verzeichnis mp4 in sich selbst nicht verschiebbar ist.
Beachten Sie, dass dieses Skript, wie Ihres, alle Dateien verschiebt, mp4
in deren Namen irgendwo " " vorkommt (z. B.: mp4list.txt
, lamp4.jpg
). Wenn Sie tatsächlich nur Dateien mit der Erweiterung " " verschieben möchten .mp4
, können Sie Folgendes verwenden:
mv *.mp4 mp4
Dadurch wird verhindert, dass die Situation auftritt, die zur Fehlermeldung bezüglich des Verzeichnisses mp4
selbst führt.
Sollte die Anzahl der MP4-Dateien so groß sein, dass der vorherige Befehl nicht funktioniert, können Sie find
dasselbe mit GNU erreichen:
find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +
oder
find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +