简而言之,我写了这个小脚本来清理一些目录,我在这些目录中合并了来自多个源的目录/文件,其中我使用了带有--backup=numbered功能的cp命令,这样具有相同名称的文件就会附加一个像.~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发布于 2015-02-11 08:41:38
您可以通过修改脚本以在错误消息中同时显示FILE和FILE2来查看问题。脚本中有一些小问题,可能会导致一些混乱(但不是“反转”逻辑):
find输出未排序。如果您有多个备份文件,随机选择的一个将替换原始文件;|sort -t~ -n -k2的表达式对输出进行排序,从而允许~[0-9]~模式的多个匹配。可以想象,你可能会有一些奇怪的文件,它以~1~~2~.~[0-9]~。嵌入式~0,例如foo~0bar~1~,会将FILE简化为foo。解决这个问题的方法可能会比较麻烦(因为后缀剥离使用了全局过滤),但是可以使用与显式位数匹配的case语句(可能三位数就足够了)来完成。https://stackoverflow.com/questions/28443624
复制相似问题