Da ist prename
, mit dem Sie REGEX verwenden können:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Verwenden Sie die Option -n
simulieren:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Hinweis: Dies wird als rename
versendet in vielen Linux-Distributionen, aber nicht in allen -- daher verwende ich den kanonischen Namen für das Dienstprogramm, das mit Perl geliefert wird.
Ich würde so etwas vorschlagen:
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-}
ersetzt das erste Vorkommen von *-doc-
mit doc-
.
Wenn Sie mehr als eine Ersetzung vornehmen müssen (siehe Kommentar Nummer 1), müssen Sie den ${var//Pattern/Replacement}
verwenden Variante. Wenn Sie den Anfang des Namens ersetzen müssen, müssen Sie ${var/#Pattern/Replacement}
verwenden , wenn Sie das Ende (dh die Erweiterung) ersetzen müssen, müssen Sie den ${var/%Pattern/Replacement}
verwenden bilden.
Weitere Einzelheiten finden Sie unter Shell-Parametererweiterung. Diese Erweiterung ist Bash-spezifisch.
Wenn Sie rename
haben dann rename 's/^.*-doc-/doc-/' *.txt
sollte reichen.
Wenn Sie in Unterverzeichnisse rekursiv gehen möchten, gibt es auch:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
Auf Systemen, die erweiterte reguläre Ausdrücke automatisch unterstützen, können Sie -E
weglassen .
Vorteile:
- rekursiert in Unterverzeichnisse
- Sie können die maximale Tiefe der Rekursion steuern
- Sie können Dateien und/oder Verzeichnisse umbenennen (-type f|d)
Nachteile:
- etwas kompliziertere reguläre Ausdrücke, da Sie den Pfad entfernen müssen, um an den Dateinamen zu gelangen
(Antwort ab hier geändert)