
人が定義したように、このコマンドはファイルから入力を受け取ります。
$ command -r FILENAME
を使用して作成されたので、これがFILENAME
ファイル名のリストを含むファイルであるとしますls > FILENAME
。
代わりに、結果をコマンドに直接提供するにはどうすればよいですかls
?私が見るには、次のことが可能です。
$ ls | command -r
しかし、そうではありません。の出力はls
パラメータとしてリンクされていません。出力:
Usage: command -r FILENAME
error: -r option requires an argument
希望の効果をどのように取得できますか?
答え1
コマンドによって異なります。ファイルから読み取るコマンドの中には、ファイルが事前に知られていて、どこからでも読み書きできる一般的なファイルであると予想しています。ファイルの内容がファイル名リストの場合、これは発生する可能性はありません。これにより、コマンドに次のものを含めることができます。管路最初から最後まで順次読み込まれます。ファイル名を必要とするコマンドにデータをパイプする方法はいくつかあります。
多くのコマンドは、
-
それを読むことを意味する特別な名前として扱います。標準入力ファイルを開く代わりに。これは義務ではない契約です。ls | command -r -
/dev
多くのUNIXバリアントは、標準記述子を指定する特別なファイルを提供します。存在する場合は/dev/stdin
、標準入力から読み取るのと同じように開いて読み取られます/dev/fd/0
。ls | command -r /dev/stdin ls | command -r /dev/fd/0
シェルがksh、bash、またはzshの場合、シェルに特定のファイル記述子を割り当てる操作を処理させることができます。この方法の最大の利点は、標準入力に依存しないため、他の目的に標準入力を使用でき、複数回使用できることです。
command -r <(ls)
コマンドが名前が特定の形式(通常は特定の拡張子)であると予想している場合は、シンボリックリンクを使用してだますことができます。
ln -s /dev/fd/0 list.foo ls | command -r list.foo
あるいは、名前付きパイプを使用することもできます。
mkfifo list.foo ls >list.foo & command -r list.foo
気づくファイルリストの生成中にls
問題が発生しました。ls
印刷できない文字が含まれていると、ファイル名が破損する傾向があるためです。printf '%s\n' *
より安定しています。ファイル名のすべてのバイトをそのまま印刷します。改行文字を含むファイル名はまだ問題を引き起こす可能性がありますが、コマンドに改行文字で区切られたファイル名のリストが必要な場合は避けられません。
答え2
それが必要です:
ls | xargs -n 1 command -r
編集:スペースがある名前の場合:
ls | xargs -d '\n' -n 1 command -r
答え3
多くのコマンドは-
「標準入力を使用する」を意味する「ファイル名」を受け入れますが、この規則は普遍的ではありません。マニュアルページを読んでください。
答え4
これはあなたの目的に適しているはずです。ls | command -r /dev/stdin