通过删除分隔子字符串来重命名文件

通过删除分隔子字符串来重命名文件

我有很多文件夹和子文件夹,其中的文件名称1. Introduction--- [ FreeCourseWeb.com ] ---.mp4我想递归地重命名所有文件(文件夹和子文件夹)以仅1. Introduction.mp4抑制 substring --- [ FreeCourseWeb.com ] ---

答案1

假设您要重命名名称开头有数字、包含---两次子字符串、紧接着.mp4名称末尾的所有文件。此外,假设您要删除两个子字符串之间的位---(包括这些子字符串本身):

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

这将查找当前目录中或当前目录下名称与给定模式匹配的所有常规文件,然后删除后缀字符串匹配---*---.mp4.mp4重新添加后缀。

不使用find(中bash):

shopt -s globstar nullglob dotglob

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

这与命令本质上相同find,但也会重命名符号链接。在开始处设置的三个 shell 选项启用**用于递归匹配子目录 ( globstar) 的通配模式,确保删除不匹配的模式而不是保持未展开 ( nullglob),并确保通配模式与隐藏名称匹配 ( dotglob)。

zsh外壳中:

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

在这里,glob 限定符中的点(.ND)使前面的模式仅匹配常规文件,而N和 的D作用类似于启用nullglobdotglobin bash,但仅适用于此特定模式。

答案2

使用包rename的工具util-linux(有时称为rename.ul)和find

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

选项-i请求覆盖现有文件的权限。


使用 Larry Wall 的 Perlrename脚本和find

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

除非使用-f/选项,否则默认情况下不会覆盖现有文件。--force您将看到一条错误消息... already exists

相关内容