简而言之,我编写了这个小脚本来清理一些目录,在这些目录中,我整合了来自多个源的目录/文件,在这些目录中,我使用了带有 --backup=numbered
功能的 cp 命令,以便具有相同名称的文件将附加诸如 .~1~
之类的后缀,以避免覆盖。然后我运行fdupes
来删除重复的文件,在某些情况下fdupes
删除了没有从cp命令附加后缀的文件(原始文件),所以我想扫描目录寻找带有cp
命令附加后缀的文件,如果删除后缀的文件不存在,我会移动mv
文件,否则我会保留它以避免删除任何内容f dupes
并不认为这是重复的。
问题在于测试条件 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
最佳答案
您可以通过修改脚本以在错误消息中同时显示 FILE
和 FILE2
来发现问题。该脚本存在一些小问题,可能会导致一些困惑(但不是“反转”逻辑):
find
输出未排序。如果您有多个备份文件,则会随机选择一个备份文件来替换原始文件;- 您可以在 find 命令末尾使用
|sort -t~ -n -k2
等表达式对输出进行排序。 - 正则表达式允许
~[0-9]~
模式的多个匹配。可以想象,您可能有一些以~1~~2~
结尾的奇怪文件。 - 删除后缀的部分假定文件名末尾有一个
~[0-9]~
。嵌入的~0
,例如foo~0bar~1~
会将FILE
缩减为foo
。解决方法会更麻烦(因为后缀剥离使用通配符),但可以使用与显式数字位数匹配的 case 语句来完成(可能三个数字就足够了)。
关于linux - find 返回反转结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443624/