
wc
この問題を解決する別の方法があることを知っていますが、stdinをファイル名またはファイル名のリストとして解釈できるようにしたいです。例えば、
ls JP*/std* | wc
同じ効果があるでしょう
wc JP*/std*
この動作を調整することは不可能ですが、私の人生をより簡単にするスクリプトを書いています。ありがとうございます。
答え1
find
と一緒に使用されますxargs
。私がこれをお勧めする唯一の理由は、ファイル名をNULで区切るオプションfind
を利用することです-print0
。これは、スペースを含むファイル名に関する問題を回避するのに役立ちます。
find . -maxdepth 1 -type f -print0 | xargs -0 wc
答え2
コマンドの出力を取得して入力ファイルのリストとして使用するには、wc
次のようにします。
wc $(ls JP*/std*)
実行されls JP*/std*
、出力がに引数として渡されますwc
。
xargs
以下はあなたにも役立ちます。
ls JP*/std* | xargs wc
よりxargs
マンページ非常に柔軟なので、使用方法の詳細を確認してください。
答え3
あなたのコメントを読んだ後
入力はファイルから来ることができます。
ファイルリストがすでにファイルに存在する場合は、検索部分をスキップしてそのxargs
部分のみを使用できます。
xargs
マニュアルページを参照してください。
-a
読みたいリストがある場所にオプションを使用して、ファイルのファイル名を渡しますxargs
。xargs
リスト内のファイル名がフルファイル名ではなく、ファイルをwc
編集するためのディレクトリがないため、渡すだけで十分でない場合は、フルパスを含めます(手動で編集せずにこれを実行できる必要があります)。sed
またはawk
同様)。
xargs
-I
または、(オプション入力)で文字列置換メカニズムを使用できます。xargs
(最後の方法を使用している場合は、各行-I
ごとに異なるプログラムが呼び出され、最大長にはいくつかの制限があります。詳細については、マニュアルページを参照してください。)
入力がファイルから来る場合(したがってオプションで提供されるメカニズムが利用できない場合-0
)、xargs
ファイル名にスペースやその他の奇妙な文字が含まれているかどうかは非常に注意する必要があります。むしろ、意図しない結果を避ける方法を見つける必要があります。
たとえば、「my document.txt」というファイルがあり、リストに次のように書き込む場合
my document.txt
その後、ファイルに書き込まれたかのように渡されます。これが行うことは次のとおりです。
wc my document.txt
これにより、wc
プログラムは2つのファイルを見つけます。 1つはmy、もう1つはdocument.txtです。
次の内容を伝える必要があります。
wc "my document.txt"
または
wc my\ document.txt
(すでに交換メカニズムを使用している場合は最初の方法が簡単になり、すでにファイルを編集している場合は2番目の方法が簡単になる可能性があります。)
-0
まあ、可能であれば各エントリがヌル文字で区切られるように入力ファイルを編集しますxargs
。