我試圖從 find 命令中排除.svg
和.jpg
文件,但它仍然返回它們。我究竟做錯了什麼?
find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)
答案1
您的邏輯有缺陷:使用您現在擁有的命令,您可以找到所有非文件.svg
或所有非.jpg
文件。你寫的內容如下:
尋找(所有不是 SVG 的內容或者所有非 JPG 的內容)
因此您將獲得 JPG 文件,因為find
已經評估了第一部分並為您提供了 SVG 文件以外的所有內容。由於選項的解析方式,如果表達式的第一部分or
計算結果為 true,則甚至不會查看第二部分。
本質上,一旦find
返回所有非 SVG 的內容,它就不會關心您想要 JPG 檔案的內容。
表達這一點的正確方法是使用邏輯and
:
find . \( ! -iname '*.svg' -a ! -iname '*.jpg' \)
這讀作:
尋找(所有不是 SVG 的內容和所有非 JPG 的內容)
或者,透過否定整個表達式:
find . ! \(-iname '*.svg' -o -iname '*.jpg' \)
內容如下:
找到所有不是的東西(SVG或者一張 JPG)
*
請注意,如果您只是將其放在單引號或雙引號中,例如,則可以跳過轉義-iname '*.jpg'
。這更容易閱讀。