So entfernen Sie den Unterstrich zwischen zwei Zahlen in allen Dateien in einem Verzeichnis

So entfernen Sie den Unterstrich zwischen zwei Zahlen in allen Dateien in einem Verzeichnis

Ich habe also ein Verzeichnis mit verschachtelten Ordnern und irgendwann liegen dort .pngBilder.

Die Benennung dieser Bilder lautet „Buchstaben_Zahlen_Zahlen_Buchstaben.png“, und ich möchte den Unterstrich zwischen den Zahlen löschen.

Angenommen, wir haben eine Datei mit dem Namen a_1_2_b.png, die ich in umbenennen möchte a_12_b.png. Ich weiß, dass ich etwas wie Folgendes verwenden muss:

find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`

aber ich bin nicht sicher, wie ich angeben soll, wie dieser spezielle Unterstrich gelöscht werden soll. Denken Sie daran, dass es noch zwei weitere Unterstriche gibt, die ich nicht ändern möchte.

Dank im Voraus!

Antwort1

Verwenden Sie eine der Varianten von perl's rename. Zum Beispiel mitDas hier( renamePaket in Debian-ähnlichen Systemen):

LC_ALL=C find . -name '*[0-9]_[0-9]*' -type f -exec rename -n -d '
  s/(?<=\d)_(?=\d)//g' {} +

(entfernen Sie den -n(Trockenlauf), wenn Sie zufrieden sind).

Mit zshkönnen Sie Folgendes tun:

autoload -Uz # best in ~/.zshrc
zmv -n  '(**/)(*[0-9]_[0-9]*)(#qD.)' \
        '$1${2//(#m)[0-9][_0-9]#[0-9]/${MATCH//_}}'

Es ist etwas komplizierter, da es in Zsh-Globs kein Äquivalent zu den Lookaround-Regexp-Operatoren von Perl gibt.

Diese entfernen alle _„s“, die in jedem normalen Dateinamen von Ziffern umgeben sind (würden die dir_1_2_3/file_1_2_foo_22_3_4_barDatei dir_1_2_3/file_12_foo_2234_barbeispielsweise umbenennen in).

Um nur das zweite Element _in regulären Dateien zu entfernen, die dem letters_digits_digits_letters.pngMuster folgen, würde das einfach lauten:

zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
       '$1$2$3'

verwandte Informationen