linux - find 返回反转结果

标签 linux bash find

简而言之,我编写了这个小脚本来清理一些目录,在这些目录中,我整合了来自多个源的目录/文件,在这些目录中,我使用了带有 --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

最佳答案

您可以通过修改脚本以在错误消息中同时显示 FILEFILE2 来发现问题。该脚本存在一些小问题,可能会导致一些困惑(但不是“反转”逻辑):

  • 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/

相关文章:

bash - 更改 Bash 中的函数参数

linux - 列出文件夹中的基本文件,其中包含文件的多个日期戳版本

linux - 使用 while/for 循环和 'find' 命令来复制文件和目录

c - Linux 内核字符驱动程序写入调用未按预期工作

bash - iTerm2 & Atom - 根据 ~/.bash_profile 中输入的 bash 命令切换配置文件,寻找建议

python - 如何从后台运行的脚本返回命令行

bash - bash中的十六进制到二进制转换

linux - 通过 xargs 将空查找结果传递给 du 会导致意外行为

Linux 可接受的平均负载

linux - 如何使用sed提取分隔符之间的字符?