Wie bereinige ich Dateierweiterungen?

9

Ich habe ein Verzeichnis mit MP3-Dateien, in denen ich die Erweiterungen in MP3 ändern möchte. Was ist der einfachste Weg, dies zu tun? Ich denke etwas in der Art von:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

... obwohl ich weiß, dass das nicht ganz richtig ist. :) Die Ersetzung ist nicht korrekt und ich bin mir nicht sicher, wie ich einen mvund einen sedBefehl mit -execin verwenden soll find.

Würde ich dafür ein Bash-Skript benötigen?

Caleb
quelle

Antworten:

12

Hier ist eine Möglichkeit, dies in Bash zu tun:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

Ich habe echohier verwendet , damit der Befehl selbst nichts anderes tut, als Paare von Dateinamen zu drucken. Wenn diese Liste die Änderungen darstellt, die Sie vornehmen möchten, können Sie echozu etwas wechseln , mv -i --das dann Ihre Dateien verschiebt (und Sie vor dem Überschreiben auffordert).

Kurze Erklärung:

Das fordurchläuft jede Datei, die mit übereinstimmt *. Dann stellen wir fest, ob die Erweiterung bereits in Kleinbuchstaben geschrieben ist. Wenn dies der Fall ist, verschieben wir sie. Wenn dies nicht der Fall ist, verschieben wir sie (oder geben sie gegebenenfalls wieder). Hierbei werden die in Bash integrierten Zeichenfolgenoperationen verwendet, über die Sie hier lesen können: http://tldp.org/LDP/abs/html/string-manipulation.html

Steven D.
quelle
Vielen Dank für Ihre Antwort und den Hinweis auf einen Link zur Manipulation von Bash-Strings!
7

In zsh:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

So kümmern Sie sich auch um .Mp3oder .mP3Dateien:

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'
Gilles 'SO - hör auf böse zu sein'
quelle
6

Sie können für diese den Befehl zum Umbenennen verwenden (beachten Sie, dass es zwei Hauptimplementierungen mit unterschiedlichen APIs gibt). Versuchen Sie beispielsweise Folgendes, um den Fall von Dateinamenerweiterungen von oben nach unten zu ändern:

  • mit renamefrom util-linux(manchmal aufgerufen rename.ul) wird angenommen, dass .JPGdie Dateinamen nur einmal vorkommen

    rename -- .JPG .jpg *.JPG
  • mit dem renamevon perl(manchmal genannt prename; mehrere Varianten wurden veröffentlicht):

    rename 's/\.JPG$/.jpg/' ./*.JPG

Hier ist ein Tutorial, wie er von einem chaotischen Bash-Skript zu diesem einfachen Befehl für genau Ihren Anwendungsfall übergegangen ist.

Ein weiterer ausgefallener Befehl dazu ist pax. Wenn Sie ZSH für Ihre Shell verwenden, können Sie auch verwenden zmv.

Caleb
quelle
Super! genau das, was ich brauchte
JoshP
Ich erhalte eine Fehlermeldung syntax error at (user-supplied code), near ".", wenn ich diesen Befehl ausführe.
Ryan Gates
3

Verwenden Sie Perl-Rename , ein Schweizer Taschenmesser zum Umbenennen von Dateien mit regulären Ausdrücken (auf Ubuntu wird dies mit dem Perl-Paket als Vorname gebündelt):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

Wenn Sie vorsichtig sind, verwenden Sie die Optionen -n und -v, um Perl umzubenennen und zu sehen, was es tatsächlich tun wird.

Kjetil Jorgensen
quelle
Danke für deine Antwort. Ich habe keinen Perlrename auf dem Server, aber ich werde später heute damit herumspielen!
0

Sie benötigen ein Skript, da "Erweiterungen" unter Linux eigentlich nur Teile der Dateinamenzeichenfolge sind. Sie müssen einige Zeichenfolgen im Skript bearbeiten, um den neuen Namen zu erhalten.

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

Das doppelte Anführungszeichen ist wichtig, wenn Sie Dateinamen mit Leerzeichen enthalten. Ich fand einige der doppelten Zitate etwas unauffällig.

Bruce Ediger
quelle
1
Es ist nichts Falsches an Ihrem Skript, aber Sie brauchen trotzig kein Skript dafür. Es gibt wahrscheinlich ein Dutzend Möglichkeiten, dies in einer Zeile in den meisten Shells zu tun, und viele Dienstprogramme, um es auch einfach zu machen.
Caleb
0

In Bash:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done
Maxime R.
quelle
0

Sichern Sie zuerst Ihre Dateien! Sie können einen Python-Einzeiler verwenden:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

BEARBEITEN:

Hier finden Sie eine detaillierte Erklärung, wie der Einzeiler tatsächlich funktioniert. Mit übergeben python -cwir einen Befehl an den Python-Interpreter. Nach dem Importieren der Bibliotheken osfür die renameFunktion und globfür die Dateiliste müssen wir die Dateiliste in dem angegebenen Verzeichnis durchlaufen, das ich aufgerufen habe PATH_TO_YOUR_DIRECTORY, zum Beispiel ./*für alles im aktuellen Verzeichnis.

In der forEinzeilensyntax funktionieren Schleifen nach der importNotation leider nicht , daher müssen wir die Klammernotation verwenden. Dh für jeden Datei- oder Verzeichnisnamen, globder uns aus dem angegebenen Pfad in Form einer Zeichenfolge gibt, ersetzen wir * .MP3 durch * .mp3.

Da OP die rekursive Suche nicht erwähnte, habe ich sie überhaupt nicht aufgenommen.

Xaratustra
quelle