用逻辑重命名文件的脚本

时间:2012-02-29 13:24:09

标签: linux bash shell scripting

有人非常友好地帮助我开始使用批量重命名脚本来重命名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

希望这有道理吗?

由于

3 个答案:

答案 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(未压缩)备份所有文件,然后重命名它们。

这不是最好的脚本,因为它不够智能,无法避免手动循环并检查相同的文件名。