2017-11-28 9 views
0

練習として、私のホームディレクトリからすべての.cファイルを見つけ、各ファイルの行を数え、ソートされた出力をfind、wc、cut ad sortを使ってsorted_statistics.txtに格納する必要があります。 は、私は、このコマンドは"... out | sort -n -o out"は実際にソートを実行しないのはなぜですか?

find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " | sort -n -o sorted_statistics.txt 

を動作するように見つかりましたが、

find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " >> sorted_statistics.txt | sort -n sorted_statistics.txt 

がちょうどソートコマンドの前に停止した理由を私は理解できません。 ちょうど好奇心から、それはなぜですか?

+1

「直前に止まる」ことはありません。パイプラインのすべての部分が同時に実行されます。最後の部分は、最初の部分と同時に実行されます。 (前のコンポーネントの出力をリダイレクトして、実際には後のコンポーネントに何も供給しない場合、後のパイプラインコンポーネントはほとんど行いません)。 –

+0

...それは、同じ出力ファイルへのパイプライン書き込みの2つの異なる部分を持つことはあまり意味がないと言いました。あなたが何をもっと詳細に記述するのに役立つかもしれません(そしておそらく、追加動作が望まれるかどうかを宣言します - 複数の統計セットを同じ出力ファイルにマージしようとしていますか? 'foo.c'の古いバージョンと*新しい*からの数字ですか? –

+0

私はそれを持っていると思います。私は一般的にパイピングするのが初めてで、シーケンシャルな実行と考えていたので、2番目のバージョンが正常に機能していると思ったのです。あなたの説明をありがとう! – FilBr

答えて

1

コマンドのこの部分は意味をなさない:

cut -f 1 -d " " >> sorted_statistics.txt | sort ... 

の出力はをカットしているため sorted_statistics.txtファイルに追加し、全く出力がソートコマンドになりません。 ティーコマンドをファイルにしても、標準出力にその入力を送り

cut -f 1 -d " " | tee -a sorted_statistics.txt | sort ... 

:あなたはおそらくティーを使用したいと思うでしょう。それはパイプラインのティージャンクションのようなものです。

+0

'cat'のメリットは?追加したい場合、 'tee -a'はその行をインラインで行うことができます。 –

+0

@CharlesDuffy:演算子 '>>'を使用すると、* sorted_statistics.txt *ファイルにコンテンツを追加したいと思います。 **ティーは**私が知る限り、それを行うことはできません。 * sorted_statistics.txt *を上書きする場合は、** cat **や* tail_sorted_statistics.txt *ファイルは必要ありません。 –

+0

私が言ったように、 'tee' *は' -a'引数が与えられればappendを行うことができます。 'tee -a somefile'はstdinの内容を' somefile'の最後に追加します。 –

1

sorted_statistics.txt(すべての出力を消費する)にすべてを追加していましたが、そのパイプの既存の出力をソート用に使用しませんでした。私はあなたのコードを修正して、今すぐ動作します。

find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " >> tmp.txt && sort -n tmp.txt > sorted_statistics.txt 

よろしくお願いいたします。

+0

なぜ 'tmp.txt'を使うのですか?メモリ内の状態を格納するのに十分なRAMがない場合、GNU 'sort'はディスク自体の一時ファイルに裏づけをすることができます。 –

+0

@CharlesDuffy私は知らない。 OPに質問してください。できるだけ少なく修正しましたので、OPにはうまくいかないものがありました。 –

+0

OPは彼らが何をしているのか分からないので、できるだけベストプラクティスを目標として、できるだけ小さな変化と比較することが良いでしょう。 –

関連する問題