Umbenennen von Dateien durch Entfernen der durch Trennzeichen getrennten Teilzeichenfolge

Umbenennen von Dateien durch Entfernen der durch Trennzeichen getrennten Teilzeichenfolge

Ich habe viele Ordner und Unterordner mit Dateien mit Namen. 1. Introduction--- [ FreeCourseWeb.com ] ---.mp4Ich möchte alle Dateien (Ordner und Unterordner) rekursiv umbenennen, um nur 1. Introduction.mp4die Teilzeichenfolge zu unterdrücken --- [ FreeCourseWeb.com ] ---.

Antwort1

Angenommen, Sie möchten alle Dateien umbenennen, die am Anfang ihres Namens eine Ziffer haben und die Teilzeichenfolge ---zweimal enthalten, unmittelbar gefolgt von .mp4am Ende des Namens. Außerdem angenommen, Sie möchten das Bit zwischen den beiden ---Teilzeichenfolgen einschließlich dieser Teilzeichenfolgen selbst entfernen:

find . -type f -name '[[:digit:]]*---*---.mp4' -exec sh -c '
    for pathname do
        mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
    done' sh {} +

Dadurch werden alle regulären Dateien im aktuellen Verzeichnis oder darunter gefunden, deren Namen dem angegebenen Muster entsprechen. Anschließend wird die entsprechende Suffixzeichenfolge entfernt ---*---.mp4und das .mp4Suffix wieder hinzugefügt.

Ohne Verwendung von find(in bash):

shopt -s globstar nullglob dotglob

for pathname in ./**/[[:digit:]]*---*---.mp4; do
    [[ ! -f $pathname ]] && continue
    mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
done

Dies ist im Wesentlichen dasselbe wie der findBefehl, benennt aber auch symbolische Links um. Die drei Shell-Optionen, die zu Beginn gesetzt werden, aktivieren das **Globbing-Muster, das zum rekursiven Abgleichen in Unterverzeichnisse verwendet wird ( globstar), stellen sicher, dass nicht übereinstimmende Muster gelöscht und nicht unerweitert beibehalten werden ( nullglob) und stellen sicher, dass Globbing-Muster mit versteckten Namen übereinstimmen ( dotglob).

In der zshShell:

for pathname in ./**/[[:digit:]]*---*---.mp4(.ND); do
    mv -i $pathname ${pathname%---*---.mp4}.mp4
done

Hier sorgt der Punkt im Glob-Qualifizierer (.ND)dafür, dass das vorangehende Muster nur mit regulären Dateien übereinstimmt, während Nund Dso wirkt, als würden nullglobund dotglobin aktiviert bash, aber nur für dieses spezielle Muster.

Antwort2

Verwenden Sie das renameTool des util-linuxPakets (manchmal auch als bezeichnet rename.ul) und find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;

Die Option -ifordert die Berechtigung zum Überschreiben vorhandener Dateien an.


Verwenden des Perl-Skripts von Larry Wall renameund find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename 's/--- \[ FreeCourseWeb.com \] ---//' {} \;

Vorhandene Dateien werden standardmäßig nicht überschrieben, es sei denn, die Option -f/ --forcewird verwendet. Stattdessen wird eine Fehlermeldung angezeigt ... already exists.

verwandte Informationen