次のディレクトリ名があります。
/aaa
/bbb
/ccc
/ddd
ディレクトリ名を渡して次のコマンドを実行したいと思います。エルエス:
ls | composer show drupal/MY_DIRECTORY_NAME_HERE --available | ack versions
このComposerコマンドに渡されたディレクトリ名を繰り返す1行のコマンドをどのように作成できますか?
答え1
コマンドを既存のすべてのサブディレクトリに適用したいので、最もきれいな方法(特殊文字を含むディレクトリ名の問題を回避する方法)は次のとおりです。
for dir in */
do
composer show drupal/"$dir" --available | ack versions
done
これは、隠されていないすべてのディレクトリとディレクトリへのシンボリックリンク(/
後続のglobパターンのため)を繰り返し、現在のディレクトリでコマンドを実行します。
これは、コマンドが末尾のパスを持つディレクトリパスを受け入れると想定していることに注意してください/
。そうでない場合は、一部のシェル文字列操作を実行して削除すると/
役に立ちます。
for dir in */
do
composer show drupal/"${dir%/}" --available | ack versions
done
補足説明:
- もちろん一行で作成することも可能です。
for dir in */; do composer show drupal/"$dir" --available | ack versions; done
- 次のように、明示的なディレクトリ名のリストを繰り返すようにコマンドを調整できます。
実際のディレクトリ名に特殊文字が含まれている場合は、個々のリスト項目を引用符で囲む必要があります(ただし、引用符だけでは不十分な状況があるため、上記のグローバルベースのアプローチは依然として最も安全です)。for dir in '/aaa' '/bbb' '/ccc' do ... done
答え2
私は何をしますか:
printf '%s\n' '/aaa' '/bbb' '/ccc' |
xargs -I{} composer show drupal/{} --available |
ack versions
または、現在のディレクトリ内のすべてのディレクトリに対して、次の操作を行います。
find . -type d -mindepth 1 -maxdepth 1 -print0 |
xargs -0 -I{} composer show drupal/{} --available |
ack versions
答え3
そしてzsh
:
for dir in *(N/); do composer show drupal/$dir --available; done | ack version
この(N/)
部分はグローバル予選、ulglobN
の場合N
、globがファイルと一致しない場合にエラーが発生しないように/
ファイル形式を選択してください。目次ただ。隠しディレクトリを含めるにはD
(D
otglobの場合)修飾子を追加します。
ディレクトリへのシンボリックリンクも含めて置き換えます(拡張子が各ファイルの末尾に追加されることを/
除いて、他のシェルでも機能します)。-/
*/
*/
/
ここでは、各コマンドに対して1つずつ実行する必要はないので、ack
すべてのコマンドの出力に対して一度だけ実行します。composer
これはまた、パイプラインの完全な終了状態がversion
パイプラインの1つ以上で見つかったかどうかを反映することを意味します。| ack version
ループ内に移動すると、完全終了ステータスは最後にversion
処理されたディレクトリに見つかったかどうかを反映するため、役に立ちません。