用几句话写了一个小脚本来清理一些目录,我从多个来源合并了目录/文件,其中我使用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 :(得分:0)
您可以通过修改脚本以在错误消息中同时显示FILE
和FILE2
来查看问题。脚本有一些小问题可能会导致一些混淆(但不是"倒置"逻辑):
find
输出未排序。如果您有多个备份文件,则随机选择的备份文件将替换原始文件; |sort -t~ -n -k2
之类的表达式对输出进行排序。~[0-9]~
模式的多个匹配。可以想象你可能有一些以~1~~2~
结尾的奇怪文件。~[0-9]~
。嵌入式~0
,例如foo~0bar~1~
会将FILE
缩减为foo
。解决方法将更麻烦(因为后缀剥离使用globbing),但可以使用匹配显式位数的case语句(可能三位数就足够了)。