多くのファイルの内容を表示する


19

コマンドラインから、複数のファイルの内容を表示する最も簡単な方法は何ですか?私のディレクトリは次のようになります。

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

次に、を除くすべてのファイルの内容を表示したいと思います.htaccess。次のようになります。

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

これは、find、xargs、およびcatの組み合わせで実行できるはずだと思いますが、その方法はわかりません。御時間ありがとうございます!


回答:


30

2つの標準コマンドはheadtail複数のファイル引数を渡すと、ファイル名付きのヘッダーを出力します。ファイル全体を印刷するには、tail -n +1(最初の行から印刷、つまりすべて)を使用します。

ここでは、名前がドットで始まる単一のファイルを除くすべてのファイルを表示するように見えます。ドットファイルは、unixでは「非表示」です。これらは、デフォルトの出力lsまたはワイルドカードの一致には表示されません。したがって、すべての非隠しファイルのマッチングは、だけで行われます*

tail -n +1 *

(厳密に言えば、tail -n +1 -- *ファイル名の1つがで始まる場合に必要です-。)


短くて甘い、ありがとう!--修飾子についてどこで読むことができるか知っていますか?
ザーナルカス

2
@Znarkus:--オプションの終わりを示すことは、ほとんどのコマンドが従う慣習です。例えばtail -n +1 -- -f -g伝えるtailこと-fと、-g(オペランド)とされていないオプションを読み込むためのファイルです。これは、POSIXユーティリティ構文ガイドライン(ユーティリティ作成者向けのドキュメント)のガイドライン10 です。エンドユーザー向けの読書の提案はありません。ある時点でそれをカバーするための優れたUNIXチュートリアルが期待されます。
ジル 'SO-悪である停止

他の多くの答えが使用することを提案するので、ただの発言 find、その後の書式設定、印刷して、いくつかのexecを使用します。使用する簡単な方法をfindしてtailいる: find . -type f -print0 -name "*" | xargs -0 tail -n +1 ---print0xargs -0--コマンドもスペースまたはで始まるファイル名で動作することを確認- )
IanH

14

すべてを1つで実行できますfind

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

それは伝えfind、すべてのファイル(見つけるために、-type f現在のディレクトリ(中).)を除いて(-not名前の)1を.htaccess-name .htaccess)。次に-printf、ファイル名が続く改行()を出力()し、ファイルで%p実行catします(-exec cat {} \;)。次のような出力が得られます。

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

これを頻繁に行う場合は、シェルスクリプトまたは関数に貼り付ける価値があるかもしれません。私はcatsそれを正確に行う名前があります:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

各ファイル名の引数をループし、ファイル名(緑色の太字)を出力し、ファイルをcatsします:

スクリーンショットの例

したがって、コマンドは次のようになります。

$ find . -type f -not -name .htaccess -exec cats {} \+

もう一方は短かったので、それを受け入れました。素晴らしい答えですが、ありがとうございます!
ザーナルカス

6

現在のフォルダー内のすべてのファイルのコンテンツを表示するには、次を試してください。

grep -vI "\x00" -- *

と同様ですが、再帰的に:

grep -vIr "\x00" -- .

形式は次のとおりfilename: contentです。

提案されたものと同様の形式を使用するには、次のようになります

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

サイドノート:

  • NULの使用(\x00上記の例で)すると、バイナリファイルが表示されなくなります(-I実際には実行されていますが、パターンを使用する必要があります)。
  • ワイルドカード(*)を使用して、次のような隠しファイルを自動的に無視します.htaccess

参照:grep:ファイル名を1回表示してから、Unix SE で行番号付きのコンテキストを表示する


2
通常grep -r ^は十分です。
催眠術


1

細かく調整したい場合、パイプ、検索、およびすべてで時間を無駄にしないでください(ただし、これまでにないほど強力なツールチェーンです)

for-loop、catなどを使用してみてください。


0

あまりにも印刷したい場合は、再帰的に使用します(たとえば、拡張子が.sqlのファイルの場合):

find -name "*.sql" -exec cat {} \; > all.sql
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.