Benennen Sie Dateien mit einem einzeiligen Befehl um


10

Ich habe dieses Verzeichnis und möchte die Dateien umbenennen:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Das Ergebnis sollte folgendermaßen aussehen:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Ich möchte dies mit gängigen Shell-Tools lösen.


1
Ich möchte dies mit gängigen Shell-Tools lösen. Ich sage nicht, dass Sie keinen guten Grund haben, aber ich vertraue darauf, dass Sie sich eine Frage gestellt und beantwortet haben: "Warum?". Als ich das letzte Mal ein sehr ähnliches Problem zu lösen hatte, schob ich Bash sofort beiseite und löste es in Python. So viel einfacher (aber ich kannte Python, String-Methoden, glob.glob und os.rename bereits - und ich musste auch einen Baum voller Ordnernamen mit Leerzeichen und anderen unangenehmen Zeichen zurückgreifen, von denen keines ein Grund für zusätzliche ist stören, wenn Sie Python verwenden)
nigel222

1
@ nigel222 Ich bin faul und möchte so wenig Zeichen wie möglich eingeben. Deshalb möchte ich hier kein Python verwenden. Versteh mich nicht falsch. Bisher ist Python meine bevorzugte Programmiersprache und wird täglich verwendet.
Guettli

Antworten:


18

Sie könnten verwenden rename...

rename -n 's/^[0-9]+ - //' *

-nNach dem Testen entfernen , um die Dateien tatsächlich umzubenennen

Erläuterung

  • s/old/new/ersetzen olddurchnew
  • ^ Anfang der Zeichenfolge
  • [0-9]+ einige Zahlen

Welche Art von Regex-Blume wird vom renameTool unterstützt? Verwendet es PCRE? ... wäre großartig.
Guettli

5
@guettli genau genommen, nein, es ist nicht PCRE (das ist Perl Compatible Regular Expressions). Das renameist ein Perl-Skript, daher bietet es vollständige Unterstützung für reguläre Perl-Ausdrücke. PCRE ist nur eine Teilmenge davon. Alles, was Sie von PCRE wissen, gilt jedoch für rename.
Terdon

@terdon Die Implementierung interessiert mich nicht. Wenn Sie es mit einer Mathe-Brille betrachten, dann renamehat Perl kompatible reguläre Ausdrücke. Ja, die PCRE-Implementierung wird nicht verwendet. Ich habe das verstanden :-) Danke für deine schnelle Antwort.
Guettli

9

bash Parametererweiterung, um den erforderlichen Teil von Anfang an zu entfernen:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Erweiterte Form:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echoist zum Trockenlaufen; loswerden für tatsächliche Aktion:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Beispiel:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

Ja, funktioniert. Vielen Dank. Da ich perlkompatiblen regulären Ausdruck aus Python kenne (den ich täglich verwende), bevorzuge ich den renameBefehl. (Weniger Eingabe erforderlich).
Guettli

1
@guettli renameist der richtige Weg, wenn Sie mit PCRE vertraut sind. Die renameAntwort wurde bereits gegeben, also muss man sich mit rein bewegen bash. Zu beachten ist, dass pythondas re(oder regex) Modul übrigens nicht vollständig PCRE-kompatibel ist.
Heemayl

@guettli Hast du auch gerade meine Antwort abgelehnt? : O
heemayl

Ja, ich habe Ihren Kommentar positiv bewertet. Ich hoffe du nimmst es nicht persönlich. Versteh mich nicht falsch, aber meine persönliche Meinung ist, dass dies ${f#[[:digit:]]*-[[:blank:]]}hässlich ist. Ja es funktioniert. Aber wir leben im 21. Jahrhundert. Ich denke, es ist Zeit, von "es funktioniert" zu "es ist einfach und macht Spaß" zu wechseln. Wenn "es funktioniert" das Ziel ist, wird Linux niemals das Vorurteil verlieren, nicht benutzerfreundlich zu sein. Da Sie bereits viele Up-Votes erhalten haben, sollte diese eine Down-Vote nicht schaden (hoffe ich). Wenn ja, sag es mir und ich werde es zurücknehmen.
Guettli

1
@guettli Was auch immer zu dir passt. Hier: gnu.org/software/bash/manual/html_node/… Nur um zu beachten, die Zeichenklasse [[:digit:]]und [[:blank:]]waren da, um Ihren zu entsprechen locale, diese sind auch in Regex ziemlich häufig.
Heemayl
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.