我有很多文件夹和子文件夹,其中的文件名称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
作用类似于启用nullglob
和dotglob
in 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
。