查找“损坏”文件,在查找命令中嵌套一个 if

1 shell bash find quoting

我试图在目录结构中找到“损坏”的文件,即文件命令将解释为“数据”的文件。这是我一直在尝试运行但失败的命令:

$ find . -type f -exec if [[ $(file \{} | cut -f2 -d':') == " data" ]] \; then echo " \{}  is CORRUPT" \; else echo " \{} is DATA" \; fi \;
find: paths must precede expression: then
Run Code Online (Sandbox Code Playgroud)

有谁知道我在这里做错了什么?

我意识到我从未if-exec参数中看到过内部。甚至有可能吗?

基本上,我试图找到符合该条件的文件(文件会将其报告为“数据”,而不是识别特定的文件类型),然后列出它们,以便我可以在删除之前进行分析。

Sté*_*las 5

您需要一个 shell 来解释这些if/then/else构造或运行这些管道(尽管您在这里并不真正需要这些):

find . -type f -exec sh -c '
  for file do
    case $(file -b "$file") in
      (data) printf "%s is CORRUPT\n" "$file";;
         (*) printf "%s is DATA\n" "$file";;
    esac
  done' sh {} +
Run Code Online (Sandbox Code Playgroud)

(就像在您的问题中一样,当file说时它会打印“CORRUPT” data。我不确定这就是您的意思)。

无论您做什么,都不要{}像其他人建议的那样包含在 shell 代码中!这将是非常危险的(并且不可移植顺便说一句),因为例如一个名为的文件$(rm -rf "$HOME")会让您删除整个主目录。