2017-02-14 5 views
-1

ディレクトリ内のすべてのファイルの最初の10行を印刷しようとしています。 現在、私が使用しています:パイプされたときにヘッドが機能しないlsの結果| grep

ls -p | grep -v/

はLSの結果から、すべてのディレクトリを削除し、ディレクトリ内のファイルだけを返すように。私がしているとき:

ls -p | grep -v/| head 

すべてのファイルの最初の10行は印刷されますが、動作しません。

誰でも手伝うことができますか?そして、あなたはそれらのファイルのそれぞれにコマンドを実行する-execを使用することができます

find . -mindepth 1 -maxdepth 1 -type f 

:カレントディレクトリ内のディレクトリではないすべてのファイルを検索するに

+0

コマンドが*期待していることをしない場合は、マニュアルページをお読みください! – hek2mgl

+0

@ hek2mgl明らかに、それは私がやった最初のことでした – FlapJack

+0

'head'がstdinからファイル名のリストを読み、それらの最初の10行を出力することをどうやって期待できますか? – hek2mgl

答えて

2

あなたの間違いは、コマンドが標準入力から受け取るのは引数であると仮定しています。そうではない。

ヘッドがパイプコマンドからデータを受け取るとき、ヘッドはデータストリームを受信します。 headコマンドは、引数として渡された1つのファイルから読み取るのとまったく同じ方法でそのデータを読み取ります。それをこのように考えて(これは擬似コードである、それは動作しません):

PSEUDO_PIPELINE <= ls -p | grep -v/# Not valid shell syntax 
head PSEUDO_PIPELINE     # Not valid shell syntax 

あり、実際にちょうどそれを表現する(有効な)方法であり、そしてそれは、プロセス置換と呼ばれている:

head <(ls -p | grep -v /) 

これは観測した結果とまったく同じ(望ましくない)結果になりますが、パイプの前のコマンドが実際には引数リストではなくファイルであることをより明白にします。

標準入力(出力ストリームの標準出力と標準エラー)は、各コマンドが起動コンテキストから受け取るものです。それはあなたが望むなら "隠された議論"のようであり、プロセスはそれとやりとりすることができます(それは特別なファイルであるにもかかわらずファイルの最後に到達するまで読み込みますが、それにもかかわらず)。

ここでは、上記のコマンドの最初の10行10行を表示し、各ファイルの最初の10行を表示していないことを理解する必要があります。

あなたはこのような何かをしたいものを達成できます。

find . -mindepth 1 -maxdepth 1 -type f -exec printf "\n%s ------\n" {} \; -exec head {} \; 

これは、それぞれのファイルを見つけ、その後、ヘッダ/区切り線、および各ファイルの最初の行を出力します。

+0

応答のおかげで、それは素晴らしい説明です。あなたが一番下に置いた例はそのまま現れるべきでしょうか?それとも具体的にするために何かを変える必要がありますか? – FlapJack

+0

@FlapJackこれは現状のままで動作するはずです(現在のディレクトリからファイルを使用します)。ヘッダー/セパレータ行を削除し、ファイル内容をすべて連続的に表示させたい場合は、最初の '-exec'から最初の' \; 'にその部分を削除することでコマンドを単純化することができます。 – Fred

+0

はい、私はそれを試してみましたが、printfの後のスペースに気付かずに失敗しました。ご協力いただきありがとうございます – FlapJack

2

+0

それは素晴らしいです、ありがとうございました – FlapJack

関連する問題