我有一千个文件夹,其中包含两个文件:其中一个文件具有随机名称(mp4 扩展名),另一个文件具有名称(srt 扩展名)。
我打算用其他文件名替换随机生成的文件名,同时保留同一文件夹中的扩展名(mp4、mkv 或 avi)。顺便说一下,文件名通常包含 () 和其他外来字符(ó、ü 等)。
在这种情况下,我认为脚本应该:
- 进入文件夹
- 获取带有 .srt 扩展名的名称
- 将扩展名为 mp4 的文件重命名为新名称(保留扩展名)
- 退出文件夹
- 递归遍历文件夹,因为它可能包含其他子文件夹
但第 5 步可能会被覆盖。
我很感激有人能帮忙。有人能帮忙吗?
答案1
试试这个小片段,
shopt -s globstar
for s in **/*.srt; do
m=( "${s%/*}"/*.mp4 )
printf '%s --> %s\n' "${m[0]}" "${s%.*}.mp4"
#mv "${m[0]}" "${s%.*}.mp4"
done
shopt -u globstar
- 如果输出符合预期,则删除
#
前面的mv
- 如果一个目录中有多个 mp4,它将只重命名找到的第一个。您可以轻松地对所有 mp4 使用循环并包含诸如etc 之
mv
类的后缀。_1
- 如果一个目录中有多个 srt,它将多次重命名 mp4,因此它将被命名为它找到的最新 srt。
答案2
尝试从其他子目录所在的父目录进行以下试运行:
find -type f -name "*.srt" |
while IFS= read -r result
do
path="${result%/*}"
fname="${result##*/}"
name="${fname%.*}"
for file in "$path"/*.{mkv,mp4,avi}
do
[ -e "$file" ] && echo mv -- "$file" "$path/$name.${file##*.}"
done
done
当您对输出满意时,删除echo
以执行实际的重命名。