*-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つのこと
3つの
find
通貨を1つにまとめるfind -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
外部ループを
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 '{}' ...
\;