Alle Dateien im Verzeichnis von $ filename_h in $ filename_half umbenennen?

139

Ganz einfach.

Wie benenne ich um?

05_h.png
06_h.png

zu

05_half.png
06_half.png

Zumindest denke ich, dass es einfach ist, aber es ist schwierig für Google, solche Dinge zu tun, es sei denn, Sie wissen es bereits.

Vielen Dank....

Richard
quelle

Antworten:

301

Verwenden Sie einfach bash, ohne externe Befehle aufrufen zu müssen.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Nicht hinzufügen #!/bin/sh

Für diejenigen, die diesen Einzeiler benötigen:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done
Bash-O-Logist
quelle
7
Gute
3
ist die Datei / _h.png / _half.png Regex?
user2799603
15
Nein, das Format lautet wie folgt: $ {string / substring / substitution} - "Erstes Auftreten ersetzen". Weitere Informationen finden Sie in diesem Spickzettel (Abschnitt "Strings"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider
11
Irgendwelche Gründe für Do not add #!/bin/sh? Ich habe versucht, beide mit / ohne diese Aussage zu arbeiten.
Ryan
6
@Ryan @Ishan Jain Tatsächlich gibt es die Backend-Shell an, die das Skript ausführen muss. sh und bash sind unterschiedliche Shells, daher kann dies das Skriptverhalten und die Syntax beeinflussen. Da das Skript einen in Bash integrierten String-Ersatz verwendet, sollten Sie den Header hinzufügen #!/bin/bash. Das heißt, Bash ist normalerweise die Standard-Shell in vielen Computern, so dass Sie nicht viele Unterschiede finden: D Weitere Informationen finden Sie hier
Cristian Ramon-Cortes
65

Versuchen Sie den renameBefehl:

rename 's/_h.png/_half.png/' *.png

Aktualisieren:

Anwendungsbeispiel:

Inhalte erstellen

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

Testlösung:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png
Michał Šrajer
quelle
1
@CarolineAlexiou: Ich habe eine Beispiel-Testsitzung hinzugefügt. Versuch es bitte. Sie haben wahrscheinlich einen Tippfehler. Was ist die Ausgabe von ls? Was rename ...versuchst du?
Michał Šrajer
2
Funktioniert nicht in Bash auf Mac, fwiw. renameist kein Standard-Unix-Tool.
Tandrewnichols
1
@tandrewnichols, probieren Sie Homebrew aus - einmal installiert, Umbenennung wird in Sekunden verfügbar mitbrew install rename
Simbamangu
4
's//'rename [options] expression replacement file...rename from util-linux 2.23.2
Was
2
Denken Sie daran, dass .JEDES Zeichen übereinstimmt, nicht nur ein Punkt - für wörtliche Punkte verwenden Sie \.stattdessen
Meisner
11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done
Karoly Horvath
quelle
1
Dies ist ideal, um vorher einen Trockenlauf durchzuführen. Ich zum ersten Mal ersetzt mv $f $fnewmit echo $fnewals die zweite Zeile der Ausgabe sieht gesund , um sicherzustellen.
Lobati
10

Suchen Sie eine reine Bash-Lösung? Es gibt viele Ansätze, aber hier ist einer.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Dies setzt voraus, dass die einzigen Dateien im aktuellen Verzeichnis diejenigen _h.pngsind, die Sie umbenennen möchten.

Viel genauer

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Angenommen, diese beiden Beispiele sind Ihre einzigen. Dateien.

Für den allgemeinen Fall, Umbenennen Datei in hat bereits abgedeckt vor .

sorpigal
quelle
6

Verwenden Sie das renamein Perl geschriebene Dienstprogramm. Könnte sein, dass es nicht standardmäßig verfügbar ist ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png
Fredrik Pihl
quelle
4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
ztank1013
quelle
4

Ich hatte eine ähnliche Frage: Im Handbuch wird das Umbenennen als beschrieben

rename [option] expression replacement file

Sie können es also auf diese Weise verwenden

rename _h _half *.png

Im Code: '_h' ist der Ausdruck, nach dem Sie suchen. '_half' ist das Muster, durch das Sie ersetzen möchten. '* .png' ist der Dateibereich, nach dem Sie nach Ihren möglichen Zieldateien suchen.

Hoffe das kann helfen c:

James Yen
quelle
1

Ein anderer Ansatz kann die Verwendung der Batch-Umbenennungsoption manuell sein

Klicken Sie mit der rechten Maustaste auf die Datei -> Benutzerdefinierte Dateibefehle -> Stapelumbenennung und Sie können h ersetzen. mit der Hälfte.

Dies funktioniert für Linux-basierte GUI mit WinSCP usw.

Easwar
quelle
0

Verwenden Sie das renameDienstprogramm:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png
C. Ramseyer
quelle
0

Einzeiler:
for file in *.php ; do mv "$file" "_$file" ; done

Jadeye
quelle
0

Obwohl der Antwortsatz vollständig ist, muss ich einen weiteren fehlenden hinzufügen.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Tharindu Sathischandra
quelle