Wie ersetze ich ein Zeichen durch ein anderes in allen Dateinamen der aktuellen Verzeichnisse?

41

Wie benennen Sie alle Dateien / Unterverzeichnisse im aktuellen Ordner um?

Nehmen wir an, ich habe viele Dateien und Unterverzeichnisse, die Leerzeichen enthalten, und ich möchte alle Leerzeichen durch einen Unterstrich ersetzen.

File 1
File 2
File 3
Dir 1
Dir 3

sollte in umbenannt werden

File_1
File_2
File_3
Dir_1
Dir_3
NobbZ
quelle

Antworten:

36

Wenn Sie auch Dateien in Unterverzeichnissen umbenennen müssen und Ihr Prädikat findunterstützt -execdir, können Sie dies tun

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Vielen Dank an @glenn jackman , der mir eine -depthOption vorgeschlagen findund mich zum Nachdenken gebracht hat.

Beachten Sie, dass auf einigen Systemen (einschließlich GNU / Linux-Systemen) findmöglicherweise keine Dateien gefunden werden, deren Name Leerzeichen sowie Folgen von Bytes enthält, die keine gültigen Zeichen bilden (typisch für Mediendateien mit Namen, deren Zeichensatz Nicht-ASCII-Zeichen enthält) vom Gebietsschema verschieden). Wenn Sie das Gebietsschema auf C(wie in LC_ALL=C find...) setzen, wird das Problem behoben.

Enzotib
quelle
Sie müssen verwenden find -maxdepth 1, um genau das zu tun, wonach das OP gefragt hat, um den aktuellen Ordner zu bearbeiten.
Caleb
1
Verwenden Sie die -depthOption find , und Sie können die loswerden sort.
Glenn Jackman
@glenn jackman: danke, ich verstehe jetzt, dass meine lösung falsch war.
Enzotib
2
Wechseln -name '* *'zu -name '*_*'und wechseln "${1// /_}"zu"${1//_/.}"
enzotib
1
@kroiz: es heißt "Mustersubstitution". Sie können es in bashder Manpage von finden.
Enzotib
34

In jeder Shell können Sie die Dateien durchlaufen, deren Name ein Leerzeichen enthält. Das Ersetzen der Leerzeichen durch Unterstriche ist in bash, ksh und zsh mit dem ${VARIABLE//PATTERN/REPLACEMENT}Konstrukt einfach .

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

Unter Debian, Ubuntu und Derivaten können Sie Perl verwenden rename(andere Distributionen liefern ein anderes Programm als rename, und dieses Programm ist hier nicht hilfreich).

rename 's/ /_/g' *

Eine obligatorische zsh-Lösung:

autoload zmv
zmv '(*)' '${1// /_}'

Eine obligatorische POSIX-Lösung:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done
Gilles 'SO - hör auf böse zu sein'
quelle
Was bedeutet das 'g' am Ende des "Umbenennen" -Befehls? Ich habe es nicht im Handbuch gesehen.
JulianLai
Wie kann ich nur das Verzeichnis umbenennen? Ich möchte den Dateinamen nicht ändern.
JulianLai
@JulianLai s/…/…/gbedeutet, alle Vorkommen zu ersetzen. Es ist nicht sehr gut im Handbuch erklärt . Wenn Sie Verzeichnisse umbenennen möchten, gibt es verschiedene Möglichkeiten. Suchen Sie danach (ich glaube, ich habe es bereits gesehen), und stellen Sie eine neue Frage, wenn Sie es nicht finden können.
Gilles 'SO - hör auf böse zu sein'
super ... das hat mir geholfen, alle _MG_blah.JPGin umzubenennen IMG_blah.JPG.
Abinash Dash
13

Sie können dafür verwenden rename(hier unter der Annahme, dass es sich um das von util-linuxund nicht um das von handelt perl):

cd /path/to/dir
rename ' ' _ *\ *

Dies findet alle Dateien und Verzeichnisse im Namen und ersetzt das Leerzeichen durch einen Unterstrich. Da die Glob-Dateiabstimmung verwendet wird, müssen Sie sich zunächst im richtigen Verzeichnis befinden.

Wenn Sie rekursive Übereinstimmungen durchführen möchten, können Sie dies tun, müssen dies jedoch möglicherweise renameeinige Male ausführen , um Elemente in Verzeichnissen abzufangen, die selbst umbenannt wurden:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
Caleb
quelle
2
" renameBenennt die angegebenen Dateien um, indem das erste Vorkommen von in ihrem Namen durch" in "ersetzt wird. Dies funktioniert also nur für Dateien mit einem einzelnen Leerzeichen im Namen. (Sie könnten renameeine Schleife aufrufen , aber es ist hier nicht wirklich das richtige Werkzeug.)
Gilles 'SO - hören Sie auf, böse zu sein'
2

Eine andere Option wäre mmv, wenn installiert.

mmv \*\ \* \#1_#2
glglgl
quelle
Dies ändert nur das erste Leerzeichen in ein _, es funktioniert nicht bei Namen mit mehreren Leerzeichen.
Gilles 'SO- hör auf böse zu sein'
Ups, du hast recht. Entschuldigung für die Verwirrung.
glglgl
1

Unter Debian / Ubuntu, basierend auf den Antworten von Caleb und Gilles, funktionierte dies für mich, um Dateien rekursiv umzubenennen:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Hinweis: Um eine Vorschau zu erhalten, welche Dateien wie umbenannt werden, verwenden Sie den -nSchalter mit rename:

rename -n 's/ /_/g' **

Noch ein Hinweis: Einstellung globstarMarken **entsprechen Dateien in allen Unterverzeichnissen, also wenn nur aktuelles Verzeichnis gewünscht wird, nicht Satz globstar oder verwenden *statt **.

Noch eine Anmerkung: Der renameBefehl muss für Dateien mit mehreren Vorkommen des Suchbegriffs mehrmals ausgeführt werden.

Markus Pscheidt
quelle
Das funktioniert nur, wenn Verzeichnisse keine Leerzeichen enthalten. (a Umbenennungs von a b/c dzu a_b/c_dnicht funktionieren würde, müssen Sie zunächst umbenennen a b/c dzu a b/c_d, und dann a bauf a_b).
Stéphane Chazelas
@Stephane: Bedeutet es, den gleichen renameBefehl zweimal auszuführen ?
Markus Pscheidt
Eher so oft, wie es verschachtelte Verzeichnisebenen mit Leerzeichen gibt. Im Idealfall möchten Sie zuerst die Verzeichnistiefe durchlaufen und nur den Basisnamen der Datei wie in der akzeptierten Lösung konvertieren. Beachten Sie auch, dass Bash **Dotfiles ausschließt und Symlinks durchläuft.
Stéphane Chazelas
0

Wenn Sie bei regulären Ausdrücken kein Flash sind (ich bin es nicht!) Und Sie Anwendungen ausführen können, die für kde entwickelt wurden (entweder verwenden Sie kde - k desktop oder Sie haben seine Bibliotheken installiert), dann ist krename ein großartiges grafisches Dienstprogramm, das Mit dieser Option können Sie das Vorher und Nachher anzeigen, bevor Sie Änderungen vornehmen. Es bietet eine Reihe einfacher Transformationen als Optionen und unterstützt auch reguläre Ausdrücke. Sie können sogar mehrere sequentielle Transformationen in einem Umbenennungsvorgang kombinieren, sodass Sie nicht eine einzige komplexe Transformation entwerfen müssen, die dies alles auf einmal erledigt. Es besteht auch die Möglichkeit, dieselben Dateien nach einer Umbenennung weiter umzubenennen.

Ich benutze es nicht so oft, aber wenn ich es tue, wird es wirklich schnell und einfach erledigt. Es ist sehr praktisch, wenn Sie verschiedene heruntergeladene Mediendateien umbenennen, damit Sie sie auf Ihrem System einheitlich verwalten können. Es ist hilfreich, das Handbuch zu krename separat herunterzuladen, damit Sie während der Verwendung des Programms darauf zugreifen können.

http://www.krename.net/

Joe
quelle