Umbenennen von Dateien unter Linux mit einem regulären Ausdruck


9

Ich hatte eine Gruppe von Dateien, die ich konsequent umbenennen möchte. Die Dateien heißen Dinge wie

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

Und ich wollte sie als Kleinbuchstaben, yyyymmdd, .log-Erweiterung

"system.20090101.log"
"something.20090101.log"

Antworten:


14

Ich habe dazu Perl-Skripte geschrieben, bis ich den Befehl zum Umbenennen entdeckte.

Es akzeptiert einen Perl-Regex, um die Umbenennung durchzuführen:

Dafür habe ich nur zwei Befehle eingegeben:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Für einige Distributionen renameist diese Funktionalität jedoch nicht verfügbar (siehe Manpage), und Sie müssen möglicherweise perl-renameoder installieren prename.


sehr schöne Antwort
Judioo

8
Achtung, einige Distributionen liefern einen wertlosen Umbenennungsbefehl. Überprüfen Sie zuerst, welche Ihre Distribution hat.
Derobert

Ich wusste, mmvaber schließlich dank renameich kann die Kraft von Regex nutzen
Ludovic Kuty

5
Unter Arch Linux ist dies perl-rename.
Oleh Prypin

6

Da ich keinen Umbenennungsbefehl habe, verlasse ich mich auf Folgendes:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done

5

mmv ist ein Standard-Linux-Dienstprogramm zum Verschieben / Umbenennen mehrerer Dateien. Es ist für die meisten Distributionen in den Repos erhältlich. Für Ihr Beispiel oben könnten Sie Folgendes tun:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Weitere Informationen finden Sie in diesem Debaday-Artikel oder auf der Manpage .


5

renameutil ist nicht sehr "Standard". Jede Distribution wird mit einem anderen renameWerkzeug geliefert . Zum Beispiel ist hier auf Gentoo renameaus dem sys-apps/util-linuxPaket und unterstützt keine Regex.

Hamish Downer schlug vor mmv, es scheint nützlich zu sein, insbesondere für die Verwendung in Skripten.

Auf der anderen Seite möchten Sie im allgemeinen Fall möglicherweise umbenennen . Es hat qmvund qcpBefehle, die einen Texteditor Ihrer Wahl öffnen (meine Präferenz: Vim) und es Ihnen ermöglichen, die Zieldateinamen dort zu bearbeiten. Nach dem Speichern und Schließen des Editors führt qmv/ qcpdie gesamte Umbenennung durch.

Beide mmvund qmvsind intelligent genug, um Dateien in der richtigen Reihenfolge umzubenennen und auch zirkuläre Umbenennungen zu erkennen. Bei Bedarf wird automatisch eine temporäre Datei erstellt.


Auf Gentoo können Sie auch das sys-apps/renamePaket erstellen, mit dem Sie renamexmRegex-Umbenennungen sowie Massen-Groß- / Kleinbuchstaben und andere nette Dinge ausführen können.
Radicand

1

Um fair zu sein:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

gibt diese Ausgabe:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Aber:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

gibt die richtige Ausgabe:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

Ersetzen des Schalters {-n} durch {-v}


1

Ich habe dazu ein kleines Bash-Skript erstellt:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

Im Allgemeinen ist das Parsen der lsAusgabe nicht die beste Idee. Eine zufällige Suche ergab diese längere Lektüre unter Unix. SE für Ihre Unterhaltung. | Außerdem würde Ihre Antwort die Frage besser mit einemtr '[:upper:]' '[:lower:]'
HBruijn
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.