Объединить несколько файлов, но включить имя файла в качестве заголовка раздела - PullRequest
310 голосов
/ 07 мая 2011

Я хотел бы объединить несколько текстовых файлов в один большой файл в терминале. Я знаю, что могу сделать это с помощью команды cat. Однако я хотел бы, чтобы имя файла каждого файла предшествовало «дампу данных» для этого файла. Кто-нибудь знает, как это сделать?

что у меня сейчас есть:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

желаемый вывод:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow

Ответы [ 19 ]

447 голосов
/ 19 октября 2011

Искал то же самое и нашел это, чтобы предложить:

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>

Если существует только один файл, заголовок не будет напечатан. Если вы используете утилиты GNU, вы можете использовать -v, чтобы всегда печатать заголовок.

171 голосов
/ 30 августа 2012

Я использовал grep для чего-то похожего:

grep "" *.txt

Он не дает вам «заголовок», но префикс каждой строки с именем файла.

95 голосов
/ 30 января 2014

Это также поможет:

find . -type f -print -exec cat {} \;

Средства:

find    = linux `find` command finds filenames, see `man find` for more info
.       = in current directory
-type f = only files, not directories
-print  = show found file
-exec   = additionally execute another linux command
cat     = linux `cat` command, see `man cat`, displays file contents
{}      = placeholder for the currently found filename
\;      = tell `find` command that it ends now here

Кроме того, вы можете комбинировать поисковые запросы с помощью логических операторов, таких как -and или -or. find -ls тоже хорошо.

22 голосов
/ 07 мая 2011

Это должно сделать трюк:

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
15 голосов
/ 13 июня 2012

У меня была серия файлов, оканчивающихся на stats.txt, которые я хотел объединить с именами файлов.

Я сделал следующее, и когда существует более одного файла, команда «more» включаетимя файла в качестве заголовка.

more *stats.txt > stats.txt

или для общего случая

more FILES_TO_CONCAT > OUTPUT_FILE
15 голосов
/ 11 мая 2012
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'

При этом будет напечатано полное имя файла (включая путь), а затем содержимое файла. Он также очень гибкий, так как вы можете использовать -name "expr" для команды find и запускать столько файлов, сколько вам нужно для файлов.

4 голосов
/ 02 августа 2017

Мне нравится эта опция

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
4 голосов
/ 16 января 2013

Вот как я обычно работаю с форматированием:

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

Обычно я передаю кота в grep для получения конкретной информации.

3 голосов
/ 13 января 2012

вы можете использовать эту простую команду вместо цикла for,

ls -ltr | awk '{print $9}' | xargs head
2 голосов
/ 04 марта 2012

Вот действительно простой способ.Вы сказали, что хотите кошку, что означает, что вы хотите просмотреть весь файл.Но вам также нужно напечатать имя файла.

Попробуйте это

head -n99999999 * или head -n99999999 file1.txt file2.txt file3.txt

Надеюсь, что поможет

...