
Ich habe viele Ordner und Unterordner mit Dateien mit Namen. 1. Introduction--- [ FreeCourseWeb.com ] ---.mp4
Ich möchte alle Dateien (Ordner und Unterordner) rekursiv umbenennen, um nur 1. Introduction.mp4
die 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 .mp4
am 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 ---*---.mp4
und das .mp4
Suffix 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 find
Befehl, 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 zsh
Shell:
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 N
und D
so wirkt, als würden nullglob
und dotglob
in aktiviert bash
, aber nur für dieses spezielle Muster.
Antwort2
Verwenden Sie das rename
Tool des util-linux
Pakets (manchmal auch als bezeichnet rename.ul
) und find
:
find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
-exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;
Die Option -i
fordert die Berechtigung zum Überschreiben vorhandener Dateien an.
Verwenden des Perl-Skripts von Larry Wall rename
und 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
/ --force
wird verwendet. Stattdessen wird eine Fehlermeldung angezeigt ... already exists
.