Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于使用逻辑文件重命名文件的脚本_Linux_Bash_Shell_Scripting - Fatal编程技术网

Linux 用于使用逻辑文件重命名文件的脚本

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

有人非常好心地帮助我开始一个大规模重命名脚本重命名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
希望这有意义


谢谢

这将检查是否有任何副本:

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