Entfernen Sie bestimmte Zeichen mit Leerzeichen aus mehreren Dateien

8

Ich versuche, eine Reihe von Musiktiteln in einem Verzeichnis umzubenennen, habe jedoch den folgenden Fehler erhalten:

Beim Verschieben mehrerer Dateien muss das letzte Argument ein Verzeichnis sein

Dies ist das Skript:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

Dies funktioniert für eine Datei ohne Leerzeichen. Wie würde ich dieses Skript ändern?

Kasper
quelle

Antworten:

14

Verwenden Sie Anführungszeichen:

mv -- "$file" "$(echo "$file" | sed ...)"

Sonst mvsieht mehrere Argumente. Ein aufgerufener Dateiname file name with spaceswäre 4 Argumente für mv. Daher der Fehler : when moving multiple files, last argument must be a directory. Wenn mvmehr als 2 Argumente vorhanden sind, wird davon ausgegangen, dass Sie mehrere Dateien in ein Verzeichnis verschieben möchten (dies wäre dann das letzte Argument).


Es sieht jedoch so aus, als ob Sie die ersten 5 Zeichen aus dem Dateinamen entfernen möchten. Das geht einfacher mit bash:

mv -- "$file" "${file:5}"

Bearbeiten : Ich habe die --Flagge hinzugefügt , dank des Kommentars von @ pabouk . Jetzt werden auch Dateien, die mit Bindestrich beginnen, -korrekt verarbeitet.

Chaos
quelle
2
Dies funktioniert möglicherweise nicht mit Dateinamen, die mit beginnen -. Anstelle von echo "$file"Gebrauch printf '%s\n' "$file".
Pabouk
Ich habe es vergessen mv. :) Du hast diesen Fall behandelt :) --- Was ich meinte, war ein Problem mit sich echoselbst. Zum Beispiel druckt GNU-Echo (sowohl Standalone- als auch Bash-Echo) diese Zeichenfolgen nicht : -n, -eund -E. Selbst gemäß der POSIX-Definition ist eine echozuverlässige Verwendung nicht möglich, da bestimmte Situationen nicht definiert sind. XSI-konform echointerpretiert Backslash-Escape-Sequenzen. --- printf '%s\n'hat keine solchen unerwünschten und implementierungsabhängigen Auswirkungen.
Pabouk
3

Sie können den Vornamen verwenden, der häufig zusammen mit Perl verteilt wird. (In Debian wird beispielsweise / usr / bin / prename vom perlPaket installiert .) Wenn es nicht von Ihrer Distribution gepackt wurde (suchen Sie nach prenameund renamein den herkömmlichen Binärdateien), kann es von einer Reihe von Stellen heruntergeladen werden, z zum Beispiel hier , hier oder hier .

Dieses Skript verwendet einen regulären Ausdruck für jeden Dateinamen und eine Reihe von Dateinamen und ändert die Namen dieser Dateien entsprechend diesem regulären Ausdruck.

Zum Beispiel könnten Sie tun

prename -v -n 's/^.{5}//' *

um zu zeigen, was passieren würde, wenn Sie die ersten fünf Zeichen in den Dateinamen entfernen. Um die Umbenennung tatsächlich auszuführen, entfernen Sie einfach die -n.

ein CVn
quelle