简而言之,写了一个小脚本来清理一些目录,我已经合并了多个来源的目录/文件,其中我使用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
我会去Python或Perl为此。在所有文件上执行'os.walk()',创建一个'dict',其中的键是后缀名,值是最近的后缀。如果您看到较小的数字,请替换该值;如果您看到裸露的文件名,请将其取消。现在,最后,包含一个数字的dict中的任何条目都包含最新的备份文件,其中thre不是主文件;循环并移动。 – tripleee 2015-02-11 09:35:19