Wie verschiebe ich Dateien, deren Namen mehrere Sonderzeichen wie „é“, „ä“ und „Leerzeichen“ enthalten?

Wie verschiebe ich Dateien, deren Namen mehrere Sonderzeichen wie „é“, „ä“ und „Leerzeichen“ enthalten?

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 verwendenlsin. Oder xargsmit den Standardeinstellungen wird die Eingabe bei Leerzeichen aufgeteilt und Anführungszeichen und Backslashs speziell behandelt. Sie müssen die -0Eingabe 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 mp4die Erweiterung haben. Die erste würde davor warnen, mp4sich 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 kshmit set -o globstarbzw. bashmit 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, mp4in 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 mp4selbst führt.

Sollte die Anzahl der MP4-Dateien so groß sein, dass der vorherige Befehl nicht funktioniert, können Sie finddasselbe mit GNU erreichen:

find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +

oder

find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +

verwandte Informationen