一部の命名変換を使用したサブディレクトリの一覧表示

一部の命名変換を使用したサブディレクトリの一覧表示

*-nom1名前に特定の文字列が含まれるか終了するサブディレクトリ(たとえば、、、*-nom2)から特定のコマンドを実行するスクリプトを作成したいと思います*-nom3。つまり

for dir in $(subs)
do
   // do something in this dir
done

私の質問は、これが私のサブディレクトリを一覧表示する方法なのか、そうでなければ最良の方法は何ですか?

subs = find -maxdepth 2 -type d -name '*-nom1'
&& find -maxdepth 2 -type d -name '*-nom2' 
&& find -maxdepth 2 -type d -name '*-nom3'

私の端末でテストしてみることができますが、Ubuntu正常に動作しているようです。

役に立つと、私のスクリプトは引き続き実行されますDebian

答え1

私が考えることができる2つのこと

  1. 3つのfind通貨を1つにまとめる

    find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
    
  2. 外部ループをfind防ぐためにコマンド実行機能を活用for

    find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \) \
    -exec sh -c 'for d; do cd "$d"; cmd1; cmd2; cmd3; ...; done' sh {} + 
    

答え2

テストを「or」表現findと組み合わせることができます。テスト間の暗黙的な演算子は「and」です。-oたとえば、

subs="$(find -maxdepth 2 -type d \( \
  -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) )"
for d in $subs ; do
  ... do something with "$d" ...
done

`-name"の周りの括弧-nom1 "-o - 名前"-nom2" -o "*-nom3" はシェル予約語なので、引用符が必要です。

don_crisstiがコメントで述べたように、一般的なアドバイスは2つの理由で出力キャプチャを避けることです。findまず、ファイル名にスペース、改行、特殊文字などを含めることができるからです。find結果。より良いイディオムは暗黙のループを使用することfindです。バラより検索結果を繰り返すのが悪い習慣である理由および関連議論:

find -maxdepth 2 -type d \( \
  -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) -exec \
  ... do something with '{}' ...
\;

関連情報