bashコマンドにディレクトリ名のみを渡す

bashコマンドにディレクトリ名のみを渡す

次のディレクトリ名があります。

/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

補足説明:

  1. もちろん一行で作成することも可能です。
    for dir in */; do composer show drupal/"$dir" --available | ack versions; done
    
  2. 次のように、明示的なディレクトリ名のリストを繰り返すようにコマンドを調整できます。
    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がファイルと一致しない場合にエラーが発生しないように/ファイル形式を選択してください。目次ただ。隠しディレクトリを含めるにはDDotglobの場合)修飾子を追加します。

ディレクトリへのシンボリックリンクも含めて置き換えます(拡張子が各ファイルの末尾に追加されることを/除いて、他のシェルでも機能します)。-/*/*//

ここでは、各コマンドに対して1つずつ実行する必要はないので、ackすべてのコマンドの出力に対して一度だけ実行します。composerこれはまた、パイプラインの完全な終了状態がversionパイプラインの1つ以上で見つかったかどうかを反映することを意味します。| ack versionループ内に移動すると、完全終了ステータスは最後にversion処理されたディレクトリに見つかったかどうかを反映するため、役に立ちません。

関連情報