424

ターミナルで多数のテキスト ファイルを 1 つの大きなファイルに連結したいと考えています。cat コマンドを使用してこれを実行できることはわかっています。ただし、各ファイルのファイル名をそのファイルの「データ ダンプ」の前に置きたいと思います。誰でもこれを行う方法を知っていますか?

私が現在持っているもの:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

望ましい出力:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
4

20 に答える 20

647

同じものを探していて、これが示唆することがわかりました:

tail -n +1 file1.txt file2.txt file3.txt

出力:

==> file1.txt <==
<contents of file1.txt>

==> file2.txt <==
<contents of file2.txt>

==> file3.txt <==
<contents of file3.txt>

ファイルが 1 つしかない場合、ヘッダーは印刷されません。GNU utils を使用-vしている場合は、常にヘッダーを出力するために使用できます。

于 2011-10-19T04:19:28.533 に答える
220

同様のものにgrepを使用しました:

grep "" *.txt

「ヘッダー」は提供されませんが、すべての行にファイル名のプレフィックスが付けられます。

于 2012-08-30T10:00:14.670 に答える
27

これでうまくいくはずです:

for filename in file1.txt file2.txt file3.txt; do
    echo "$filename"
    cat "$filename"
done > output.txt

または、すべてのテキスト ファイルに対してこれを再帰的に行うには:

find . -type f -name '*.txt' -print | while read filename; do
    echo "$filename"
    cat "$filename"
done > output.txt
于 2011-05-06T22:08:32.570 に答える
24

複数の入力ファイルがある場合、moreコマンドはそれらを連結し、各ファイル名もヘッダーとして含めます。

ファイルに連結するには:

more *.txt > out.txt

ターミナルに連結するには:

more *.txt | cat

出力例:

::::::::::::::
file1.txt
::::::::::::::
This is
my first file.
::::::::::::::
file2.txt
::::::::::::::
And this is my
second file.
于 2012-06-12T20:31:05.900 に答える
15
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'

これにより、完全なファイル名 (パスを含む) が出力され、次にファイルの内容が出力されます。find コマンドに -name "expr" を使用し、ファイルに対して好きなだけコマンドを実行できるため、非常に柔軟です。

于 2012-05-11T14:59:06.047 に答える
5

これは私が通常そのようなフォーマットを処理する方法です:

for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;

私は通常、特定の情報を得るために猫をgrepにパイプします。

于 2013-01-16T12:19:09.860 に答える
5

私はこのオプションが好きです

for x in $(ls ./*.php); do echo $x; cat $x | grep -i 'menuItem'; done

出力は次のようになります。

./debug-things.php
./Facebook.Pixel.Code.php
./footer.trusted.seller.items.php
./GoogleAnalytics.php
./JivositeCode.php
./Live-Messenger.php
./mPopex.php
./NOTIFICATIONS-box.php
./reviewPopUp_Frame.php
            $('#top-nav-scroller-pos-<?=$active**MenuItem**;?>').addClass('active');
            gotTo**MenuItem**();
./Reviews-Frames-PopUps.php
./social.media.login.btns.php
./social-side-bar.php
./staticWalletsAlerst.php
./tmp-fix.php
./top-nav-scroller.php
$active**MenuItem** = '0';
        $active**MenuItem** = '1';
        $active**MenuItem** = '2';
        $active**MenuItem** = '3';
./Waiting-Overlay.php
./Yandex.Metrika.php
于 2017-08-02T15:50:37.687 に答える
4

for ループを使用する代わりに、この単純なコマンドを使用できます。

ls -ltr | awk '{print $9}' | xargs head
于 2012-01-13T15:18:43.893 に答える
2

これは本当に簡単な方法です。cat したいと言ったのは、ファイル全体を表示したいことを意味します。ただし、ファイル名も印刷する必要があります。

これを試して

head -n99999999 *またhead -n99999999 file1.txt file2.txt file3.txt

それが役立つことを願っています

于 2012-03-04T18:40:43.123 に答える
1
find . -type f -exec cat {} \; -print
于 2015-12-17T03:50:39.893 に答える
0
  • AIX 7.1 ksh

...私たちの何人かにとって頭がうまくいくとすでに言及している人たちに頭を悩ませます:

$ r head
head file*.txt
==> file1.txt <==
xxx
111

==> file2.txt <==
yyy
222
nyuk nyuk nyuk

==> file3.txt <==
zzz
$

私の必要は最初の行を読むことです。前述のように、10 行以上が必要な場合は、オプション (head -9999 など) を追加する必要があります。

派生的なコメントを投稿して申し訳ありません。コメントしたり、誰かのコメントに追加したりするのに十分な通りの信用がありません。

于 2016-03-21T15:46:30.930 に答える
-1

このメソッドは、ファイル名とファイルの内容を出力します。

tail -f file1.txt file2.txt

出力:

==> file1.txt <==
contents of file1.txt ...
contents of file1.txt ...

==> file2.txt <==
contents of file2.txt ...
contents of file2.txt ...
于 2015-04-13T09:57:26.157 に答える
-2

このタスクを解決するために、私は通常、次のコマンドを使用します。

$ cat file{1..3}.txt >> result.txt

ファイル数が非常に多い場合、ファイルを連結するのに非常に便利な方法です。

于 2018-04-15T09:08:45.117 に答える