webentwicklung-frage-antwort-db.com.de

Umbenennen von Dateien im Stapel

Ich möchte eine Reihe von Dateien in einem Verzeichnis umbenennen, sodass die vorangegangene Nummer und der Hypen aus dem Dateinamen entfernt werden.

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW

Wie mache ich das mit einem Linux-Befehl?

18
van

Das sollte es machen:

rename 's/^[0-9]*-//;' *

Es erhält von Anfang an den Block [0-9] (dh Zahlen) viele Male, dann den Bindestrich - und löscht ihn aus dem Dateinamen.


Wenn sich rename nicht auf Ihrem Computer befindet, können Sie eine Schleife und mv verwenden:

mv "$f" "${f#[0-9]*-}"

Prüfung

$ ls
23-aa  hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa  hello aaa23-aa

Oder:

$ ls
23-a  aa23-a  hello
$ for f in *;
> do
>   mv "$f" "${f#[0-9]*-}"
> done
$ ls
a  aa23-a  hello
38
fedorqui

Ich denke, dieser Befehl wäre besser, wenn Sie den folgenden Befehl ausführen: 

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv

Hier 
ls * - listet Dateien im aktuellen Ordner auf
sed -e - führt den Ausdruck aus
p; - druckt den alten Dateinamen 
s/alter name/neuer name/- neuen Dateinamen erzeugen 
xargs -n2 - verarbeitet zwei Argumente für mv
mv - ruft zwei Parameter auf und führt eine Verschiebungsoperation aus 

Empfehlung: Bevor Sie mv ausführen, überprüfen Sie, was Sie mit echo erreichen möchten.

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo

Folgendes Beispiel benennt um 

SCCF099_FG.gz5329223404623884757.tmp bis
SCCF099_FG.gz

ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv
19
doms

Wenn die ersten Zahlen immer gleich lang sind:

for F in *new ; do
    mv $F ${F:8}
done

Der ${parameter:number} führt eine Erweiterung des Teilstrings aus - nimmt den String ab dem 8. Zeichen an.

Es gibt viele andere Zeichenfolgenbearbeitungen in Erweiterungen, um andere Fälle zu behandeln.

6
David Souther

Verwenden von renamer (für Windows, Mac und Linux geeignet):

$ renamer --find '/\d+-(.*)/' --replace '$1' *

Dadurch werden alle Zahlen und der erste Bindestrich vom Anfang aller Dateien im aktuellen Verzeichnis entfernt.

3
Lloyd

Mit vimv können Sie mehrere Dateien mit den Textbearbeitungsfunktionen von Vim umbenennen.

Durch die Eingabe von vimv wird ein Vim-Fenster geöffnet, in dem alle Dateien aufgelistet sind. Sie können Muster anpassen, visuell auswählen usw., um die Namen zu bearbeiten. Nach dem Beenden von Vim werden die Dateien umbenannt.

Der screencast in der Datei README zeigt, wie er die Frage des ursprünglichen Posters löst.

[Disclaimer: Ich bin der Autor des Tools]

1
thameera

Dies mag ein wenig komplex aussehen, ist aber ziemlich effektiv und funktioniert sowohl auf * nix- als auch auf OSX-Systemen. Es verhält sich auch rekursiv und benennt Dateien im aktuellen Verzeichnis sowie in allen Unterverzeichnissen um:

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
cp temp1 temp2 && \
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
paste temp1 temp2 > temp3 && \
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
sh ./temp3 && \
rm temp1 temp2 temp3

Hier ist eine Zusammenfassung dessen, was gerade passiert ist:

In der ersten Zeile werden alle Dateien gesucht (find), beginnend mit den Dateien im aktuellen Verzeichnis (.), deren Name dem Muster (-regex) von "7 Zahlen, gefolgt von einem Bindestrich, gefolgt von 0 oder mehr Zeichen" ('.*/[0-9]\{7\}[-].*') entspricht. ) und schreibe diese Dateinamen und ihre jeweiligen Pfade (-print) in eine Datei namens temp1 (> temp1). Beachten Sie, dass die -print-Direktive in den meisten Fällen wahrscheinlich nicht erforderlich ist, aber nichts schaden sollte.

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \

Kopieren Sie dann (cp) den Inhalt von temp1 in eine Datei mit dem Namen temp2.

cp temp1 temp2 && \

Öffnen Sie anschließend die Datei temp2 mit dem Texteditor vi und geben Sie vi zwei Befehle (mit -c für jeden neuen Befehl):

  1. Befehl Nr. 1:
    • Durchsuchen Sie jede Zeile von temp2 (:g) nach dem gleichen Muster, nach dem Sie oben gesucht haben, mit der Ausnahme, dass Sie die Ergebnisse mit Hilfe von Klammern (\([0-9]\{7\}[-]\)\(.*\)) gruppieren.
    • Bewegen Sie den Cursor für jede übereinstimmende Zeile an den Ort, an dem die Übereinstimmung gefunden wurde, und ersetzen Sie die gesamte Übereinstimmung nur durch die zweite Gruppe des übereinstimmenden Musters (\2).
  2. Befehl Nr. 2:
    • Speichern Sie die Änderungen in temp2 und schließen Sie die Datei (:x).

Das Ergebnis davon ist dies:

 vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \

Verketten Sie nun die Zeilen von temp1 mit denen von temp2 (paste) und schreiben Sie jede neu kombinierte Zeile in eine Datei mit dem Namen temp3 (> temp3).

paste temp1 temp2 > temp3 && \

Führen Sie als Nächstes vi erneut aus, und führen Sie die gleichen Schritte wie oben aus. Suchen Sie diesmal jedoch nach dem Anfang jeder Zeile (^) in der Datei temp3 und fügen Sie mv hinzu. und ein Leerzeichen direkt danach (mv).

vi -c ":g/^/s//mv /" -c ":x" temp3 && \

Führen Sie dann den Inhalt von temp3 (./temp3) als Shell-Skript (sh) aus.

sh ./temp3 && \

Entfernen Sie schließlich (rm) alle temporären Dateien, die wir während des gesamten Vorgangs erstellt haben.

rm temp1 temp2 temp3
1
jerdiggity

Es gibt auch ein praktisches GUI-Tool pyRenamerhttps://wiki.ubuntuusers.de/pyRenamer/

1
Pedi T.

Ich mag wirklich etwas wie "umbenennen * .mp3 * .mp4".

Aber keine andere Antwort gibt mir das. Also habe ich ein Hash-Programm geschrieben, um es zu tun.

https://hackage.haskell.org/package/batch-rename

Damit können Sie: batch_rename "DCIM * .jpg" "* .png"

0
Joyer

Sie können dieses Tool verwenden: rnm

Code, um das zu tun, was Sie möchten:

rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'

-fo ist nur für den Dateimodus
-dp ist die Tiefe des Verzeichnisses (-1 bedeutet unbegrenzte Tiefe).
-rs ist eine Ersetzungszeichenfolge. \d+- regex wird durch leere Zeichenfolge ersetzt.
-ss ist eine Suchzeichenfolge. Er sucht nach Dateien mit ^\d+- regex. (Es könnte jedoch ausgelassen werden, einige harmlose Fehlermeldungen werden auf dem Bildschirm gedruckt).

0
Jahid