為什麼我無法從 Linux 中的 find 指令中排除 2 個或更多模式?

為什麼我無法從 Linux 中的 find 指令中排除 2 個或更多模式?

我試圖從 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'。這更容易閱讀。

相關內容