変数でLinux "find"コマンドのマルチネーム機能を使用しますか?

変数でLinux "find"コマンドのマルチネーム機能を使用しますか?

find次のコマンドを使用して複数のファイル名を検索する方法を学びました。

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

ただし、場合によってはあまりにも多くのフィルタを使用する必要があるため、単純なコマンドラインが非常に長くなります。

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

変数を作成し、ここにすべてのフィルタを追加してから、findコマンドで再利用できますか?ありがとうございます!

答え1

GNUを介して実装された複数のfindファイル名を検索する別の方法があります。

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

\|論理正規表現OR(GNUデフォルト正規表現型のemacs型)find。ヌードは.すべてのキャラクターを意味します。一点はです\.

$rgx_compraとaを定義した$rgx_media後に組み合わせることができます。

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

ここでは括弧を省略しました。

答え2

配列変数(例:)をサポートするシェルを使用しているので、bash配列変数を作成して直接使用できます。

定数表現

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

変数表現

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

または

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

配列変数拡張自体には、"${opts[@]}"1つ以上の項目が含まれていても、二重引用符()で囲む必要があります。配列に項目がない場合は、次に展開されます。何もない(空の文字列ではない、""

答え3

はい、可能です。以下に示す方法を使用してください。引用符、ワイルドカードなどの使用に注意してください。それにもかかわらず、解決策は次のとおりですBASH

opt="-iname '*.srt' -o -iname '*.mp4'"
find . \( $(eval echo ${opt}) \)

単にコマンドから変数を呼び出すことはできませんが、${opt}インラインコマンドを使用してfind問題を解決できます。eval$(eval echo ${opt})

関連情報