2015-02-10 73 views
0

简而言之,写了一个小脚本来清理一些目录,我已经合并了多个来源的目录/文件,其中我使用cp命令和--backup=numbered功能,以便具有相同名称的文件具有附加后缀.~1~以避免覆盖。然后,我运行fdupes删除重复的文件,在某些情况下,fdupes删除了没有从cp命令(原始文件)追加后缀的文件,所以我想扫描目录查找带有后缀cp命令的文件如果该文件不存在与后缀删除,我会移动mv该文件,否则我会离开它,以避免删除任何东西fdupes并不认为它是重复的。找到返回的结果

问题是测试条件if [ -f ... ]下面的代码的一部分返回倒过来的结果比它应该和我不明白为什么。例如,当文件存在时它将返回false,当文件不存在时它将返回true。我通过颠倒我想要根据倒排返回码进行的操作来解决这个问题,并验证它是按照预期工作的,并且它是这样运行的,但是想知道是否有人知道它为什么会按照它的方式工作。我不是任何方式的bash脚本专家,所以我可能错过了一些简单的东西。

#!/bin/bash 
logfile=$$.log 
exec > $logfile 2>&1 

IFS=' 
' 
#set -f 

for FILE in $(find . -type f -regextype posix-extended -regex '^.*(\.~[0-9]+~)+$') 
do 
    FILE2=${FILE%%.~[0-9]*} # remove the suffix 
    if [ -f "${FILE2}" ] 
    then 
     echo ERROR: "${FILE2}" already exists! 
    else 
     echo "${FILE}" renamed "${FILE2}" 
     mv "${FILE}" "${FILE2}" 
    fi 
done 
+0

我会去Python或Perl为此。在所有文件上执行'os.walk()',创建一个'dict',其中的键是后缀名,值是最近的后缀。如果您看到较小的数字,请替换该值;如果您看到裸露的文件名,请将其取消。现在,最后,包含一个数字的dict中的任何条目都包含最新的备份文件,其中thre不是主文件;循环并移动。 – tripleee 2015-02-11 09:35:19

回答

0

您可能能够通过修改脚本来显示错误消息都FILEFILE2看问题。脚本中存在一些可能导致混淆的小问题(但不是“倒置”逻辑):

  • find输出未排序。如果您有多个备份文件,随机选择一个将替换原始文件;
  • 您可以使用类似|sort -t~ -n -k2的表达式在find命令末尾对输出进行排序。
  • 正则表达式允许~[0-9]~模式的多个匹配。可以想象,你可能会有一些奇怪的文件,以~1~~2~结尾。
  • 删除后缀的部分假定一个单独的~[0-9]~位于文件名的末尾。嵌入的~0,例如foo~0bar~1~将减少FILEfoo。解决这个问题的方法会更麻烦(因为后缀剥离使用通配符),但是可以通过匹配显式数字位的case语句来完成(可能三位数就足够了)。
+0

是的,当我注意到发生了什么时,我确实拥有它,所以我可以看到$ FILE和$ FILE2,并且看不到任何异常情况。对于文件后缀我有。〜1〜和。〜1〜。〜2〜正如你所提到的,我认为我看到的最多的是三个,但这并不是说没有更多...它的许多目录和数千我正在处理的文件。这就是为什么我在正则表达式中使find命令足够灵活的原因。 – 2015-02-11 01:17:05

+0

根据我的理解,删除后缀的部分将是贪婪(%%),并会从第一个〜1〜删除到文件名的末尾,并且从测试中看起来就是这样做的。在最初的测试过程中,我观察到目标文件被识别得很好,后缀被正确删除,但文件存在的测试似乎是倒置的......非常奇怪。我试图在第二个测试脚本中进行复制,似乎无法在该脚本中复制该问题。 – 2015-02-11 01:28:50

+0

复制问题有几种可能性(a)你的脚本确实修改了文件系统,(b)当然,“find”没有被排序。 – 2015-02-11 02:07:01