web-dev-qa-db-de.com

Mac OS X Terminal Batch umbenennen

ich habe einen Ordner mit einer Reihe von Dateien mit dem Namen:

prefix_1234_567.png
prefix_abcd_efg.png

ich möchte stapelweise einen Unterstrich und den mittleren Inhalt entfernen, damit die Ausgabe erfolgt

prefix_567.png
prefix_efg.png

danke relevant, aber nicht vollständig erklärend: wie kann ich Dateien mit dem Terminal stapelweise umbenennen?Regex, um Dateien in OS X Terminal stapelweise umzubenennen

100
kidnim

In Ihrem speziellen Fall können Sie den folgenden Befehl bash verwenden (bash ist die Standard-Shell unter macOS):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

Hinweis: Wenn die Wahrscheinlichkeit besteht, dass Ihre Dateinamen mit - Beginnen, stellen Sie -- Davor [1]:
mv -- "$f" "${f/_*_/_}"

Hinweis: echo wird mv vorangestellt, um einen Probelauf durchzuführen. Entfernen Sie es, um die eigentliche Umbenennung durchzuführen.

Sie können es über die Befehlszeile ausführen oder in einem Skript verwenden.

  • "${f/_*_/_}" Ist eine Anwendung von bashParametererweiterung : Das (erste) Teilstring-Übereinstimmungsmuster _*_ Wird durch Literal _ Ersetzt. effektiv das mittlere Zeichen aus dem Namen schneiden.
  • Beachten Sie, dass _*_ Ein Muster (ein Platzhalterausdruck, wie er auch zum Verschieben verwendet wird) ist, nicht ein regulärer Ausdruck (um mehr über Muster zu erfahren , führen Sie man bash aus und suchen Sie nach Pattern Matching).

Wenn Sie häufig Dateien stapelweise umbenennen, sollten Sie ein spezielles Tool wie das Perl-basierte Dienstprogramm rename installieren. Unter macOS können Sie es mit dem gängigen Paketmanager Homebrew wie folgt installieren:

brew install rename

Hier ist das Äquivalent des Befehls oben mit rename:

rename -n -e 's/_.*_/_/'  *.png

Auch dieser Befehl führt einen Probelauf durch. Entfernen Sie -n, um die tatsächliche Umbenennung durchzuführen.

  • Ähnlich wie bei der bash -Lösung führt s/.../.../ Eine Textsubstitution durch, jedoch werden - anders als in bash - true reguläre Ausdrücke verwendet.

[1] Das spezielle Argument --, Das von den meisten Dienstprogrammen unterstützt wird, soll signalisieren, dass nachfolgende Argumente als Operanden (Werte) behandelt werden sollen, auch wenn sie = sind schau wie optionen aufgrund des Anfangs mit -, wie Jacob C. notiert.

205
mklement0

Um Dateien umzubenennen, können Sie das Dienstprogramm rename verwenden:

brew install rename

So ändern Sie beispielsweise eine Suchzeichenfolge in allen Dateinamen im aktuellen Verzeichnis:

rename -nvs searchword replaceword *

Entfernen Sie den Parameter 'n', um die Änderungen zu übernehmen.

Mehr Info: man rename

88
David Thomas

Sie könnten sed verwenden:

ls * | sed -e 'p;[email protected]_.*[email protected][email protected]' | xargs -n2 mv

ergebnis:

prefix_567.png prefix_efg.png

* Um zuerst einen Probelauf durchzuführen, ersetzen Sie mv am Ende durch echo

Erläuterung:

  • e: Optional für nur 1 sed Befehl.
  • p: um die Eingabe in sed zu drucken, wird in diesem Fall der ursprüngliche Dateiname vor dem Umbenennen verwendet
  • @: ist ein Ersatz für /, um sed lesbarer zu machen. Das heißt, anstatt sed s/search/replace/g zu verwenden, verwenden Sie s @ search @ replace @ g
  • _. *: Der Unterstrich ist ein Escape-Zeichen, das auf das aktuelle '.' verweist. Zeichen null oder mehrmals (im Gegensatz zu JEDEM Zeichen in Regex)
  • -n2: Gibt an, dass 2 Ausgänge als Parameter an mv übergeben werden müssen. Für jede Eingabe von ls generiert dieser sed-Befehl 2 Ausgaben, die dann an mv geliefert werden.
12
l'L'l

Ich hatte eine Reihe von Dateien, die so aussahen: be90-01.png und musste den Bindestrich in Unterstrich ändern. Ich habe das benutzt, was gut funktioniert hat:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
7
JanB

sie können den Befehl rename mithilfe von brew installieren. mach einfach brew install rename und benutze es.

2
Nisim Joseph

mmv verwenden

mmv '*_*_*' '#1_#3' *.png
1
αғsнιη

versuche dies

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

Hier ist ein anderer Weg:

for file in Name*.png; do mv "$file" "01_$file"; done
1
Joolah