根据另一个目录中的文件名重命名目录中的文件

根据另一个目录中的文件名重命名目录中的文件

我不确定这里是否有人问过这个问题,但这是我的问题。我有文件可以说dir1命名为:

File 1.mp4
File 2.mp4
etc..

现在在目录上dir2,我有名为:

Sub 1.srt
Sub 2.srt
etc..

我怎样才能重命名,Sub 1.srt使它变成File 1.srt.所以基本上将所有*.srt文件重命名为文件名*.mp4。两个目录上的文件数量相同,并且使用printf %s\\n *文件已排序。

答案1

由于两个目录包含相同数量的文件,因此有一种方法将文件名保存在两个数组中,然后对数组索引列表中的每个索引进行重命名(因为两个数组具有相同的长度):

mp4paths=(dir1/*.mp4)              # save mp4 file names in array
mp4names=("${mp4paths[@]##*/}")    # remove leading path components
name=("${mp4names[@]%.*}")         # remove extension
srt=(dir2/*.srt)                   # save srt file names in array
for i in "${!srt[@]}"              # for each index in the list of array indices 
do                                 # do stuff here...
mv "${srt[$i]}" dir2/"${name[$i]}".srt
done

这应该适用于所有类型的文件名。
对于“空运行”,替换mvprintf '%s -> %s\n'.

答案2

paste -d=  <(ls dir2/*.srt)  <(ls dir1/*.mp4) | 
  perl -nlE 's/=dir1(.*).mp4/" "dir2$1.srt/; say("mv \"",$_, "\"")'  |
  bash
  • 第一行产生如下行dir2/sub 1.srt=dir1/file 1.mp4
  • 第二行将它们更改为mv "dir2/sub 1.srt" "dir2/file 1.srt"
  • 第三行执行这些行

答案3

假设这些文件可能不是字面上命名为“File 1.mp4”和“Sub 1.srt”(尽管脚本仍然有效,如果它们是),但两组文件中的数字匹配:

#! /bin/sh

dir1='./dir1'
dir2='./dir2'

find "$dir1" -maxdepth 1 -name '*.mp4' | while IFS= read f ; do
    num=$(echo "$f" | sed -e 's/^.* \([0-9]\+\)\.mp4/\1/')
    subtitle=$(find "$dir2" -maxdepth 1 -name "* $num.srt" | head -1)
    if [ -n "$subtitle" ] ; then
        bn=$(basename "$f" .mp4)
        mv "$subtitle" "$dir2/$bn.srt"
    fi
done

注意:这适用于除文件名中带有换行符的文件之外的所有文件。这head -1是为了防止脚本在碰巧有多个具有相同编号的 .srt 文件时失败......在这种情况下,找到的第一个文件将被重命名,其他文件将被忽略。

如果您希望将字幕移至与 .mp4 文件相同的目录中,请将行更改mv为:

mv "$subtitle" "$dir1/$bn.srt"

相关内容