我不确定这里是否有人问过这个问题,但这是我的问题。我有文件可以说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
这应该适用于所有类型的文件名。
对于“空运行”,替换mv
为printf '%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"