使用同一文件夹中另一个文件的名称重命名文件

使用同一文件夹中另一个文件的名称重命名文件

我有一千个文件夹,其中包含两个文件:其中一个文件具有随机名称(mp4 扩展名),另一个文件具有名称(srt 扩展名)。

我打算用其他文件名替换随机生成的文件名,同时保留同一文件夹中的扩展名(mp4、mkv 或 avi)。顺便说一下,文件名通常包含 () 和其他外来字符(ó、ü 等)。

在这种情况下,我认为脚本应该:

  1. 进入文件夹
  2. 获取带有 .srt 扩展名的名称
  3. 将扩展名为 mp4 的文件重命名为新名称(保留扩展名)
  4. 退出文件夹
  5. 递归遍历文件夹,因为它可能包含其他子文件夹

但第 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以执行实际的重命名。

相关内容