入力(マルチFIFO)に基づいて動的プロセス置換を生成する方法は?

入力(マルチFIFO)に基づいて動的プロセス置換を生成する方法は?

他のコマンドの出力に基づいて複数のプロセス置換を作成しようとしていますが、これを行う方法がわかりません。

例のシナリオとして、次のファイルのリストを提供しました。

touch a.txt b.txt c.txt d.doc e.doc f.pdf g.pdf h.xls i.xls

私は仕事をします。利用可能なファイル拡張子のリスト:

ls -1 *.* | awk -F. '{if (NF>1) {print $NF}}' | sort | uniq

次に、動的リストに基づいて次のようなFIFOを生成しようとします。たとえば、次のようになります。

pr -mt <(ls -1 *.doc) <(ls -1 *.pdf) <(ls -1 *.txt) <(ls -1 *.xls)

これにより、各グループを別の列に印刷できます。しかし、上記のFIFOリストはハードコーディングされているので、私の目標は動的コマンドの数(ワイルドカード、usingなど)を置き換える方法を見つけることevalですxargs

別の状況は、以下で説明される。ここ

上記の問題に対する具体的な解決策(解決方法)には興味がありません。これは1つの状況にすぎないからです。私はシェルでプロセス交換を動的に生成する方法や、これを達成するために使用できる他のツールに興味があります。

また見なさい:匿名FIFOを生成する方法は?

ベストアンサー1

文字列を動的に作成して評価するのは簡単です。

eval "$(echo -n 'pr -mt '; while read ext; do echo "<(ls -1 *.$ext)"; done < list  |tr '\n' ' ' )"

コマンドを構築する拡張リストを表すlistファイル(おそらくfifo)。

<()デフォルトでは、名前のないFIFOを生成します。評価を必要としない代替案は、次の名前を使用することです。

while read ext; do mkfifo ${ext}.pipe; ls -1 *.$ext > ${ext}.pipe & done
pr -mt *.pipe
rm *.pipe  #remove the named pipes when done

上記は、ディレクトリに「.pipe」で終わる他のファイル名がないと仮定しています。

おすすめ記事