首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找返回的颠倒结果

查找返回的颠倒结果
EN

Stack Overflow用户
提问于 2015-02-11 07:07:37
回答 1查看 65关注 0票数 0

简而言之,我写了这个小脚本来清理一些目录,我在这些目录中合并了来自多个源的目录/文件,其中我使用了带有--backup=numbered功能的cp命令,这样具有相同名称的文件就会附加一个像.~1~这样的后缀,以避免覆盖。然后我运行fdupes来删除重复的文件,在某些情况下,fdupes删除了cp命令没有后缀的文件(原始文件),所以我想扫描目录,查找由cp命令附加了后缀的文件,如果该文件不存在,删除了后缀,我会移动mv该文件,否则我会保留该文件,以避免删除任何内容,因为fdupes不认为它是重复的。

问题是测试条件,下面代码的if [ -f ... ]部分返回了比它应该返回的结果相反的结果,我不明白为什么。例如,当文件存在时,它将返回false;当文件不存在时,它将返回true。我修复了它,根据倒置的返回代码反转了我想要做的操作,并验证了它是否按预期工作,所以我就这样运行了它,但我想知道是否有人知道它为什么会这样。我不是一个bash脚本专家,所以我可能错过了一些简单的东西。

代码语言:javascript
复制
#!/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
EN

回答 1

Stack Overflow用户

发布于 2015-02-11 08:41:38

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

  • find输出未排序。如果您有多个备份文件,随机选择的一个将替换原始文件;
  • 您可以在find-command.
  • the正则表达式的末尾使用类似于|sort -t~ -n -k2的表达式对输出进行排序,从而允许~[0-9]~模式的多个匹配。可以想象,你可能会有一些奇怪的文件,它以~1~~2~.
  • the部分结尾,其中去掉了后缀,假设文件名的末尾有一个~[0-9]~。嵌入式~0,例如foo~0bar~1~,会将FILE简化为foo。解决这个问题的方法可能会比较麻烦(因为后缀剥离使用了全局过滤),但是可以使用与显式位数匹配的case语句(可能三位数就足够了)来完成。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28443624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档