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)