Linux 用于使用逻辑文件重命名文件的脚本
有人非常好心地帮助我开始一个大规模重命名脚本重命名PDF文件 正如你所看到的,我需要添加一些逻辑性的东西来阻止下面发生的事情——比如在重复的文件名中添加一个唯一的数字Linux 用于使用逻辑文件重命名文件的脚本,linux,bash,shell,scripting,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 An
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
希望这有意义
谢谢这将检查是否有任何副本:
rename -n [...] | grep -o ' renamed as .*' | sort | uniq -d
如果您得到任何形式的输出重命名为[…]
,则会发生冲突
当然,这在一些特殊情况下不起作用-例如,如果文件包含换行符或重命名为的文本字符串。如我在上一个问题中所述:
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 '{}' \;
该命令为您提供了许多选项,用于指定在哪些文件上运行、递归工作以及将所有文件名传递给脚本。脚本使用tar(未压缩)备份所有文件,然后重命名它们
这不是最好的脚本,因为它不够聪明,无法避免手动循环并检查相同的文件名
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
之前 之后
为什么要将文件重命名为其名称的前缀?它不会改变它们的顺序,不会保存键入,因为在键入文件名的所有常见上下文中都支持完成,并且它会丢失信息,因为数字在某些上下文中可能确实有意义。@kev我得到了shebang,我还错过了什么吗?
for。。。;当…时做
,。。。;do
,i+=1
等
$ 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