ディレクトリリストからコマンドを実行したいですgradle --build-cache
。また、ディレクトリは "Project"文字列で始まる必要があり、 "Test"で終わらないでください。次のコマンドを使用してこれを正常に実行しました。
find . -maxdepth 1 -type d \( ! -name . \) -name "Project*" ! -name "*Test*" -exec sh -c "cd '{}' && pwd && gradle --build-cache" \;
しかし、私の問題は、gradleコマンドが失敗する可能性があることです。コマンドのみを実行すると「exit 1」が返されますが、ディレクトリコマンドの1つが失敗すると、失敗を返さずにスクリプトが続行されます。最後に、ループは成功を返しますexit 0
...
gradleコマンドが失敗したときにループの実行を停止して通常のコマンドに戻る方法はexit 1
?
ありがとうございます:)
答え1
同様の質問です。https://apple.stackexchange.com/questions/49042/how-do-i-make-find-fail-if-exec-fails。私はあなたの目標を達成する可能性が最も高い2つの便利な方法をリストしました。
最も簡単な方法はを使用することですが、xargs
これはコマンドが見つかるパスにスペースがない場合にのみ機能しますfind
。
find … -print0 | xargs -0 -n1 invalid_command
古いBash(4.xx未満)を使用している場合は、再帰ワイルドカードの検索と使用を削除するか、再帰検索を直接実装することもできます(ディレクトリツリーが問題を引き起こすのに十分深いかどうか疑問です)。
shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done
または、1行で作成する必要がない場合は、まずすべてのディレクトリを見つけて一時ファイル(mktemp
そのファイル用)に保存し、リストを使用して必要なすべての操作を実行できます。さらにフィルタリングするには、その項目に対してコマンドを実行します。
答え2
最後のコマンドがエラーで終了したかどうかをテストし、その行に追加してexit
コマンドif [[ $? != 0 ]] ; then exit ; fi
を実行できます。
提供されたコードスニペットが大きなスクリプトの一部である場合、スクリプトは完全に終了します。これを使用できるように、for
orループで書き直すことをお勧めします。while
break
答え3
楽しみにしてここにfind
唯一の答えがあります。 POSIX機能だけではこれを行うことはできないようですが、find
すでにいくつかのGNUismを使用しているので、基本機能を利用できます-quit
。
$ find -exec command {} \; -o -quit
これは失敗するとfind
すぐに終了しますcommand
(つまり、ゼロ以外の終了コードを返します)。これでfind
、ゼロ以外の状態で強制終了するには、の操作を実行する必要があります-quit
。
$ find -exec command {} \; -o -fprint /dev/full -quit
すべての書き込みが/dev/full
失敗するためです。次のエラーメッセージが表示されます。
find: ‘/dev/full’: No space left on device
2>/dev/null
必要に応じてフィルタリングできます。
使用する場合NetBSD ルックアップ、次のようにすることができます。
$ find -exec command {} \; -o -exit 1