Linux - Ersetzen von Leerzeichen in den Dateinamen

96

Ich habe eine Reihe von Dateien in einem Ordner und möchte jedes Leerzeichen in allen Dateinamen durch Unterstriche ersetzen. Wie kann ich das erreichen?

Mithun Sreedharan
quelle

Antworten:

172

Dies sollte es tun:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
neesh
quelle
Das hat bei mir nicht funktioniert. Es wurde behauptet, dass identische Dateien existieren (mit den falschen Dateinamen). ZB beim Umbenennen versucht 1 - foo.jpgund mein Ordner hatte 1.jpgschon drin.
Byxor
3
Ich finde Backticks etwas schwer zu lesen, wenn sie sich in der Nähe von Anführungszeichen befinden. Das gleiche, aber besser lesbar wärefor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron
Hinweis: Dies wird INNERHALB des Verzeichnisses ausgeführt, dessen Dateinamen Sie aktualisieren möchten. Alternativ können Sie ändern *zu PATH_TO_YOUR_DIRECTORY.
CFitz
70

Ich bevorzuge die Verwendung des Befehls 'Umbenennen', der reguläre Ausdrücke im Perl-Stil verwendet:

rename "s/ /_/g" *

Sie können einen Trockenlauf mit dem Flag -n durchführen:

rename -n "s/ /_/g" *
DF.
quelle
3
Dies wird funktionieren, wenn Sie den Perl-Stil umbenennen und nicht den einfacheren Redhat / Fedora
David Dean
9
Die Fedora-Version wärerename " " "_" *
David Dean
4
renameIn OSX nicht verfügbar.
Etienne Low-Décarie
Unter macOS 10.12.3 renameist verfügbar.
Sung Cho
1
@DavidDean Das Umbenennen unter Arch Linux ersetzt nur das erste Vorkommen (nicht sehr praktisch für Dateien / Verzeichnisse mit mehreren Leerzeichen). Es hat die gleiche Syntax wie das Fedora, daher vermute ich, dass es sich um dieselbe handelt. Perl-Rename kann jedoch installiert werden.
Prosoitos
15

Verwenden Sie sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Wenn Sie dies ausprobieren möchten, bevor Sie den Abzug betätigen, wechseln Sie einfach mvzu echo mv.

DigitalRoss
quelle
4

Wenn Sie bash verwenden:

for file in *; do mv "$file" ${file// /_}; done
Murali VP
quelle
Als ich es versuchte, bekam ich mv: Wenn ich mehrere Dateien verschiebe, muss das letzte Argument ein Verzeichnis sein. Versuchen Sie mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'für weitere Informationen.
Mithun Sreedharan
Wieder Fehler mv: fehlendes mv --help' for more information. mv: missing file argument Try Dateiargument Versuchen Sie mv --help 'für weitere Informationen. mv: fehlendes mv --help' for more information. mv: missing file argument Try Dateiargument Weitere Informationen finden Sie unter mv --help '.
Mithun Sreedharan
@ levislevis85: Thx, wusste das nicht.
Soulmerge
4

Was ist, wenn Sie die Ersetzungsaufgabe rekursiv anwenden möchten ? Wie würdest du das machen?

Nun, ich habe die Antwort gerade selbst gefunden. Nicht die eleganteste Lösung (versucht auch, Dateien umzubenennen, die nicht der Bedingung entsprechen), aber es funktioniert. (Übrigens musste ich in meinem Fall die Dateien mit '% 20' umbenennen, nicht mit einem Unterstrich)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done
Javipas
quelle
2

Versuchen Sie etwas Ähnliches, vorausgesetzt, alle Ihre Dateien waren .txt-Dateien:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
Amir Afghani
quelle
2
hat den folgenden Fehler tr: Beim Übersetzen von mv müssen zwei Zeichenfolgen angegeben werden: Argument für fehlende Datei Versuchen Sie `mv --help 'für weitere Informationen.
Mithun Sreedharan
2
Agin error tr: zu viele Argumente Versuchen Sie tr --help' for more information. mv: missing file argument Try mv --help 'für weitere Informationen.
Mithun Sreedharan
2

Hier ist eine andere Lösung:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. verwendet awk, um den Namen der Datei in Anführungszeichen zu setzen
  2. verwendet sed, um Leerzeichen durch Unterstriche zu ersetzen; druckt den ursprünglichen Namen mit Anführungszeichen (von awk); dann der ersetzte Name
  3. xargs nimmt 2 Zeilen gleichzeitig und übergibt sie an mv
Yoogottamk
quelle
1

Zitieren Sie Ihre Variablen:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Entfernen Sie das "Echo", um die eigentliche Umbenennung vorzunehmen.

Ghostdog74
quelle
Es gibt die mv-Befehle korrekt wieder, benennt die Datei jedoch nicht wirklich um!
Mithun Sreedharan
Das Entfernen des Echos führt zu einem Fehler wie mv: kann nicht stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': Keine solche Datei oder kein solches Verzeichnis mv: kann nicht stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Keine solche Datei oder kein solches Verzeichnis
Mithun Sreedharan
Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP Fr 14. August 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan
1

Der einfachste Weg, eine Zeichenfolge (in Ihrem Fall ein Leerzeichen) durch eine andere Zeichenfolge zu ersetzen, Linuxist die Verwendung von sed. Sie können dies wie folgt tun

sed -i 's/\s/_/g' *

Hoffe das hilft.

Desta Haileselassie Hagos
quelle
Dies geht nicht auf die Frage ein.
Amit
0

Um alle Dateien mit einer .pyErweiterung umzubenennen, verwenden Sie: find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Beispielausgabe,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
Akilesh Raj
quelle