Bash

查找“損壞”文件,將 if 嵌套在 find 命令中

  • March 6, 2016

我試圖在目錄結構中查找“損壞”文件,即文件命令將解釋為“數據”的文件。這是我一直在嘗試執行但失敗的命令:

$ 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

有誰知道我在這裡做錯了什麼?

我意識到我從未見過參數if內部-exec。甚至可能嗎?

基本上,我試圖找到符合該標準的文件(文件會將其報告為“數據”,而不是辨識特定的文件類型),然後列出它們,以便我可以在刪除之前進行分析。

您需要一個 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 {} +

file(就像在你的問題中一樣,它在說時會列印“CORRUPT” data。我不確定這就是你的意思)。

無論您做什麼,都不要{}像其他人建議的那樣包含在 shell 程式碼中!這將是非常危險的(並且不可移植),例如一個名為的文件$(rm -rf "$HOME")會使您刪除整個主目錄。

引用自:https://unix.stackexchange.com/questions/267934