2012-09-23 11 views
33

catの内容の前に各ファイル名を印刷する方法が見つかりません。ここでは、私がやろうとしているものです:私はそれらのファイルからテキストだけを得たが、私は実際にはファイル名と一緒にテキストをしたい最後のコマンドでファイル名がcatであるすべてのファイルの内容を表示する

[email protected]:~/Perl/t$ ls 
1.txt 2.txt 3.txt 
[email protected]:~/Perl/t$ echo " I am " >> 1.txt 
[email protected]:~/Perl/t$ echo " trying " >> 2.txt 
[email protected]:~/Perl/t$ echo " to do this " >> 3.txt 
[email protected]:~/Perl/t$ cat *.* 
I am 
trying 
to do this 
[email protected]:~/Perl/t$ 

。この

Filename:1.txt 
<Data in the file> 

Filename:2.txt 
<Data in that file> 

Filename:3.txt 
<Data in that file > 

答えて

54

catは、ファイル名を印刷しないように私が意味します。 get the shell to do itのいずれか、またはheadまたはtailを代わりに使用します。複数のファイルを渡すときにファイルの名前が表示されます(正確には同じ形式ではありません)。ファイル全体を印刷するには、tail -n +1を使用してください(行1から始まり、行は1から番号が付けられます)。

tail -n +1 -- *.txt 
+1

これは非常に簡単に見えます。私はあなたが言及した理由を知っているかもしれません - テールコマンドの1後。それらがなければ同じ出力が得られるからです。何か隠された理由はありますか? http://fastebin.com/1WgHAUZq –

+3

少なくとも 'tail(GNU coreutils)8.13'では' tail -n 1 - * .txt'が 'tail -n 1'の最後の行だけを出力するので、' tail -n +1 - * .txt'にする必要があります。各ファイル。また、 '--'は' -'で始まるファイル名のオプションとして解釈を防止します –

+8

または 'grep^*'はファイル名を各出力行の接頭辞として出力します。 ' - * .txt'の代わりに – tripleee

14
$ for f in *; do echo "Filename: $f"; cat "$f"; done 
Filename: 1.txt 
I am 
Filename: 2.txt 
trying 
Filename: 3.txt 
to do this 
+0

aah!それは素晴らしい友達です。ありがとう、シンプルなコード。 –

+3

汚れたハックはありません。迷惑出力はありません。自己説明と直感的。 +1 –

+2

私がこのソリューションについて最も気に入っているのは、そこにあるLinuxのバージョンの中で最もストリップしているバージョンでも動作するということです(例えば、xargs、less、more、findなどのbusyboxを持つルータの場合)構成)。ありがとうございました! – NoUsername

34

これは最近のブログ記事4 unix commands I abuse every dayを通じてHacker News上で議論されました。

それの要旨はこれを使用していた:

more * | cat 

は、これを取得するには:

for ... do ... doneループよりも多くきれいです
:::::::::::::: 
jack.txt 
:::::::::::::: 
Once upon a time 
there was a fellow named Jack. 
:::::::::::::: 
lyingryan.txt 
:::::::::::::: 
Now that "trickle down economics" has been 
tested for 30 years and the data shows it 
has been a total failure, candidates 
still claim that cutting taxes for 
billionaires will help the economy. 
:::::::::::::: 
market.txt 
::::::::::::::: 
Jack went to market to sell the family 
cow. 
He came back with a handful of magic beans. 

ブログ投稿には、head -n 99999 *などの異なるUnix間で互換性を持たせるために、Linuxでのみ動作するhead -n 0 *と比較して、このアプローチの多くの代替案が記載されています。

+0

'head -n 99999 *'はMac OSXで私のために働いていました。 – rcdmk

9

あなたは単に

ls -1 *.txt | xargs -I % sh -c "echo % ; cat %" 

と例えばそれを達成することができます

  • すべての.txtファイル
  • ためのコマンドecho filename ; cat filenameを実行します(%-Iによって定義された置換パターンである)
+1

+1きれいでクリーンでユニバーサルなソリューション。 – cajwine

+0

@Nemoコマンドで-I%sh -cが実行することを説明できます – CodeCrack

13
find . -name \*.txt -print -exec cat {} \; 
8

また、使いすぎ少しはそれを達成grepすることができます。

grep -r '.*' *.txt 

のgrep以上のことができます

grep -rn '.*' *.txt 

行番号を取得するには何でも探します。ケースでは、あなたも簡素化していることができ、空の行に興味を持っていません。

grep -r . *txt 

はまた-r grepのスイッチを再帰的に実行するためにはgrepを行い、あなたが

grep -r . . 

の内容を一覧表示することができますので、現在のディレクトリにあるすべてのファイル。

[編集] ダウンサイド:これは遅いので、多数のファイルでは使用しません。

+1

これは、ソースコードの行単位での監査、特定のパターンの存在を保証するためのすべてのコード行のスキャン、およびそれは同じ行のファイル名も報告しません。 –

関連する問題