Linux - Ersetzen von Leerzeichen in den Dateinamen


Antworten:


172

Dies sollte es tun:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

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" *

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.


4

Wenn Sie bash verwenden:

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

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

2

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

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

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

1

Zitieren Sie Ihre Variablen:

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

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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.