Wie benennt man mehrere Dateien um, indem man in der Mitte 4 Zeichen entfernt, die in jedem Dateinamen unterschiedlich sind, sich aber an derselben Stelle befinden?

Wie benennt man mehrere Dateien um, indem man in der Mitte 4 Zeichen entfernt, die in jedem Dateinamen unterschiedlich sind, sich aber an derselben Stelle befinden?

Ich möchte meine Dateien mit Bash umbenennen, indem ich 4 Zeichen in der Mitte entferne.

Originaldateinamen:

dwe_hiul123456.pdf
dwe_lkyd345876.pdf
dwe_ythn157843.pdf

Ich möchte die 4 Buchstaben in der Mitte entfernen, sodass die neuen Dateinamen lauten:

dwe_123456.pdf
dwe_345876.pdf
dwe_157843.pdf

Die 4 Buchstaben folgen immer dem _und es wird immer einer _im Dateinamen sein. Alle Dateinamen sind gleich lang und die vier Zeichen, die ich entfernen möchte, stehen an der gleichen Stelle.

Ich bin hier wirklich neu und weiß nicht, welche Version ich verwende, außer dass ich Windows 10 verwende. Ich habe versucht, dies über das Git Bash-Befehlsfenster zu tun.

Antwort1

Wenn Sie über perl-rename verfügen (verfügbar renameauf Debian-basierten Systemen, perl-renameauf anderen), können Sie Folgendes tun:

$ rename -n 's/_..../_/' *pdf
dwe_hiul123456.pdf -> dwe_123456.pdf
dwe_lkyd345876.pdf -> dwe_345876.pdf
dwe_ythn157843.pdf -> dwe_157843.pdf

Dies -nführt dazu rename, dass nur das ausgegeben wird, was ohne Änderungen geschehen würde. Sobald Sie bestätigt haben, dass es wie gewünscht funktioniert, entfernen Sie es -nund führen Sie den Befehl erneut aus, um die Dateien tatsächlich umzubenennen:

rename 's/_..../_/' *pdf

Wenn dies aus irgendeinem Grund nicht möglich ist rename, können Sie es auch mit einer einfachen Shell-Schleife tun:

for file in *pdf; do
    echo mv -- "$file" "${file/_????/_}"
done

Wenn Sie sicher sind, dass dies das gewünschte Ergebnis liefert, entfernen Sie erneut das , echoum die Befehle tatsächlich umzubenennen:

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

Antwort2

Verwenden vonParametererweiterung:

$ for i in *.pdf; do
    echo mv -- "$i" "${i/_[a-z][a-z][a-z][a-z]/_}"
    #  actual `mv` command
    # mv -- "$i" "${i/_[a-z][a-z][a-z][a-z]/_}"
  done
mv -- dwe_hiul123456.pdf dwe_123456.pdf
mv -- dwe_lkyd345876.pdf dwe_345876.pdf
mv -- dwe_ythn157843.pdf dwe_157843.pdf

Wenn Sie mit dem Ergebnis zufrieden sind echo, entfernen Sie es, um den Befehl tatsächlich auszuführen.

verwandte Informationen