有人非常友好地帮助我开始使用批量重命名脚本来重命名PDF文件。
正如您所看到的,我需要添加一些逻辑来阻止下面发生的事情 - 所以像在重复的文件名中添加一个唯一的数字?
rename 's/^(.{5}).*(\..*)$/$1$2/' *
rename -n 's/^(.{5}).*(\..*)$/$1$2/' *
Annexes 123114345234525.pdf renamed as Annex.pdf
Annexes 123114432452352.pdf renamed as Annex.pdf
希望这有道理吗?
由于
答案 0 :(得分:2)
for i in *
do
x='' # counter
j="${i:0:2}" # new name
e="${i##*.}" # ext
while [ -e "$j$x" ] # try to find other name
do
((x++)) # inc counter
done
mv "$i" "$j$x" # rename
done
$ ls
he.pdf hejjj.pdf hello.pdf wo.pdf workd.pdf world.pdf
$ ls
he.pdf he1.pdf he2.pdf wo.pdf wo1.pdf wo2.pdf
答案 1 :(得分:0)
这应该检查是否会有任何重复:
rename -n [...] | grep -o ' renamed as .*' | sort | uniq -d
如果您获得renamed as [...]
形式的任何输出,那么您就会发生碰撞。
当然,这不适用于几个极端情况 - 例如,如果您的文件包含换行符或文字字符串renamed as
。
答案 2 :(得分:0)
正如我之前提问answer中所述:
for f in *.pdf; do
tmp=`echo $f | sed -r 's/^(.{5}).*(\..*)$/$1$2/'`
mv -b ./"$f" ./"$tmp"
done
这将备份已删除或覆盖的文件。一个更好的选择是这个脚本:
#!/bin/bash
for f in $*; do
tar -rvf /tmp/backup.tar $f
tmp=`echo $f | sed -r 's/^(.{5}).*(\..*)$/$1$2/'`
i=1
while [ -e tmp ]; do
tmp=`echo $tmp | sed "s/\./-$i/"`
i+=1
done
mv -b ./"$f" ./"$tmp"
done
运行如下脚本:
find . -exec thescript '{}' \;
find命令为您提供了许多选项,用于指定要运行的文件,递归工作,并将所有文件名传递给脚本。该脚本使用tar(未压缩)备份所有文件,然后重命名它们。
这不是最好的脚本,因为它不够智能,无法避免手动循环并检查相同的文件名。