パラメータリストをテキストファイルからbashスクリプトに間接的に送信できますか?

パラメータリストをテキストファイルからbashスクリプトに間接的に送信できますか?

ワイルドカードを含む私がやりたいls @files.lstいくつかのことをするつもりです。ls [contents of files.lst]

私は上記の構文(at-sign、ファイル名)をどこか(おそらく最後の氷河期以前の古いデジタルオペレーティングシステム?)で覚えているようです。 Bashの順列、間接参照、パラメータ、リストを検索しても役に立ちませんでした。私はこれを(すべて?!)スクリプトに書き込む方法があることを知っていますが、bashは私がこれまでにやっていなかったより一般的な方法ですでにそれを実装していますか?

更新:これはBSD / Darwin(ATM)に固有のものですが、より一般的な回答にも感謝します。私はMacを使っていますが、今は明らかではなくても計算上の非効率性が他人の邪魔にならず、作業負荷も最小化されます。より興味深いのは、既存のシェルスクリプトを使用してコマンドラインからコマンドを受け取ることができることです。ほとんどの場合、そうなります。

ベストアンサー1

テキストファイルの各行でいくつかのタスクを実行したい場合は、通常2つの方法があります。

  1. ファイルを1行ずつ読み、ループ本体の行で実行する必要がある操作を実行します。

    while IFS= read -r pathname; do
        ls -d -- "$pathname"
    done <files.list
    

    上記のコードはファイルから行を読み取り、各行files.listls -d --実行されます。

    関連:

  2. xargsまたは、GNUなどのループを暗黙的にするユーティリティを使用してくださいparallel

    xargs -I {} -- ls -d -- {} <files.list
    

    このコードは上記のループと同じことをxargsしますが。引数は、改行がエスケープされている場合に挿入できる行です(引用符も処理されるため、そのままにするにはエスケープする必要があります)。ls -d --files.list

    xargs -- ls -d -- <files.list
    

    上記のコードは、ls -d --ファイル内でできるだけ多くのパラメータを同時に実行します。埋め込みタブまたはスペースを含むパラメータは引用符で囲む必要があり、個々の埋め込み改行と引用符はエスケープする必要があります。

    GNUparallelユーティリティはGNUユーティリティよりも多様で、xargs実行される操作をよりよく制御できます。

  3. シェルは通常データ処理に使用できる最も遅い言語なので、ファイル内の各行に対してコマンドを実行する以外に他の作業を実行する必要がある場合は、それをより簡単に実行できる言語を使用することをお勧めします。これをするために。これらの言語の例:

    • アッ
    • 真珠
    • Python

どちらの場合も、ファイルに改行で区切られたパス名を保存するため、完全に引用しない限り、改行を含むパス名(Unixシステムでは許可されています)は使用できません(マニュアルをxargs参照)。xargs

おすすめ記事