11

パイプから結果を取得することを検討してください。

find .

ここで、パイプの背後にある 2 番目のコマンドで実際にパイプされた (入力された) ものにアクセスし、たとえばそれを 2 回出力したいと思います。

find . | printf $arg$arg\n
#each filename would be printed twice per line

質問は、パイプから2回取得したものを印刷することについて尋ねているわけではないことに注意してください.bash for loopを使用する方法、または上記を達成できるスクリプトを作成する方法を知っています。$argをインライン スクリプトですばやく使用するにはどうすればよいですか?

$0 と $1 は、スクリプト ファイルのようには機能しません。

4

3 に答える 3

10

ファイル名に改行が含まれる可能性を無視して、sedpringleyが彼の回答で示唆しているように使用するか、次のコマンドでwhileループを作成できます。read

find . |
while read -r line
do
    echo "$line$line"
done

(-rは「生の」入力用です。これは、シェルが入力でバックスラッシュ エスケープ シーケンスを展開するのを停止し、シェル内のreadコマンドの標準 POSIX 機能です。)

に言及しているので、改行の代わりにヌルバイト(Cの場合)で各名前を終了するオプションをbash使用して、ファイル名の改行の問題を回避し、次を使用できます。find . -print0'\0'

find . -print0 |
while read -r -d '' line
do
    echo "X${line}${line}X"
done

は、通常の改行区切り文字を文字列引数の最初の-d ''文字に置き換えますが、文字列は空であるため、最初の文字だけがヌル バイトです。

for次の行に沿ってループを使用する簡単な方法はありません (私の知る限り、難しい方法もありません) 。

for line in $(find .)
do
    echo "X${line}${line}X"
done

これは、スペースまたは改行を含む名前に対して確実に機能します。

多くの場合、コマンドを使用したい場合がありますxargs。これは標準入力を読み取り、標準入力から読み取ったものをコマンドの引数として使用してコマンド ラインを作成します。

find . | xargs wc -l

または、改行とスペースの安全性 (デフォルトでは、xargsスペース、タブ、および改行で引数を分割します):

find . -type f -print0 | xargs -0 wc -l

適用できるオプションはたくさんありますxargs— 特に GNU バージョンです。

findただし、大部分がxargs冗長になるオプションもあります。

find . -type f -exec wc -l {} +

これは基本的にコマンドと同じ仕事をしfind . -print0 | xargs -0 wc -lます。1 つの違いは、 からの出力にファイルがない場合find、 using-execはまったく実行wcされませんが、デフォルトでxargsは 1 回実行されます (ファイル名の引数なし。これは POSIX 準拠のためです)。GNUでは、 orをxargs使用してその発生を止めることができます。とにかくMac OS Xはそうしているようです。-r--no-run-if-emptyxargs

于 2013-07-25T02:23:07.533 に答える
9

簡単な答え: sed を使用して各ファイルを 2 回印刷できます。

find . | sed 's/.*/& &/'

Sed は、入力された行を編集できます。上記のコマンドはs、(substitute) .*(行全体) & &(それ自体で、2 回) と言っています。

より長い答え:あるプログラムを別のプログラムにパイプすると、最初のプログラムの標準出力ストリームが 2 番目のプログラムの標準入力ストリームに接続されます。最初のプログラムが出力するものはすべて、2 番目のプログラムの入力として扱われます。

$argsあなたの例では残念ながら、入力は仮想変数にうまくマップされる行ごとのチャンクにはなりません。それは大きなモノリシック ストリームで提供されます。ストリームの各行を 2 回印刷する場合は、sed (ストリーム エディター) を使用できますが、行ごとの置換を行っているだけです。

于 2013-07-25T00:52:25.973 に答える