Linux

在變數中使用linux’find’命令的多個名稱功能?

  • December 31, 2019

我新學會瞭如何使用以下方法搜尋多個文件名find

find . \( -iname "*.srt" -o -iname "*.mp4" \)

但在某些情況下,我不得不使用這麼多這樣的過濾器,而那個簡單的命令行變得如此之長:

find . \( -iname "*.srt" -o ......... \)

我可以創建一個變數並在其中添加所有過濾器,然後在 find 命令中再次使用它嗎?謝謝!

使用 GNU 實現find,還有另一種搜尋多個文件名的方法:

rgx='.*\.srt\|.*\.mp4'
find . -iregex "$rgx"

\|是邏輯正則表達式 OR(在預設的 GNU 正則表達式類型中find,即 emacs 類型)。裸.表示任何字元。一個點是\.

您可以定義 a$rgx_compr和 a $rgx_media,然後將其組合:

find . -iregex "$rgx_compr" -o -iregex "$rgx_media"

我在這裡省略了括號。

由於您使用的是支持數組變數(即bash)的外殼,因此您可以創建一個數組變數並直接使用它。

常量表達式

find . \( -iname "*.srt" -o -iname "*.mp4" \) ...

變數表達式

opts=(-iname "*.srt" -o -iname "*.mp4")
find \( "${opts[@]}" \) ...

或者

opts=( '(' -iname "*.srt" -o -iname "*.mp4" ')' )
find "${opts[@]}" ...

請注意,數組變數擴展本身必須用雙引號 ( "${opts[@]}") 括起來,即使它包含一個或多個項目。如果數組不包含任何項目,它將擴展為空(不是空字元串,"")。

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