Я хотел бы объединить несколько текстовых файлов в один большой файл в терминале. Я знаю, что могу сделать это с помощью команды cat. Однако мне бы хотелось, чтобы имя файла каждого файла предшествовало «дампу данных» для этого файла. Кто-нибудь знает, как это сделать?
что у меня сейчас есть:
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
желаемый результат:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Ответы:
Искал то же самое, и нашел это, чтобы предложить:
Вывод:
Если есть только один файл, то заголовок не будет напечатан. Если вы используете утилиты GNU, вы можете
-v
всегда печатать заголовок.источник
-n +1
вариант! Альтернатива:head -n-0 file1 file2 file3
.-n
и+1
, как в-n+1
.tail -n +1 *
именно то, что я искал, спасибо!sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
Я использовал grep для чего-то похожего:
Он не дает вам заголовок, но префикс каждой строки с именем файла.
источник
*.txt
расширяется только до одного файла. В связи с этим я бы посоветовалgrep '' /dev/null *.txt
grep
будет печатать только заголовки файлов, если существует более одного файла. Если вы хотите всегда печатать путь к файлу, используйте-H
. Если вы не хотите использовать заголовки-h
. Также обратите внимание, что он будет печатать(standard input)
для STDIN.ag
(серебряный искатель): по умолчаниюag . *.txt
префикс каждого файла имеет свое имя, а каждая строка - свой номер.-n
к grep также дает номера строк, которые позволяют вам писать простые строки с точным указанием, которые могут быть получены, например, emacs.Это также должно помочь:
Средства:
Кроме того, вы можете комбинировать поиски через логические операторы типа
-and
или-or
.find -ls
тоже приятно.источник
-print
не напечатает имя файла передcat
.-printf
для настройки вывода. Например:find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;
чтобы соответствовать выводуtail -n +1 *
brew install findutils
а затем использоватьgfind
вместоfind
.find
позволяет несколько-exec
s:find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
Это должно сделать трюк:
или сделать это для всех текстовых файлов рекурсивно:
источник
$0
это целая строка, так что у вас есть повторяющиеся столбцы там ...У меня была серия файлов, оканчивающихся на stats.txt, которые я хотел объединить с именами файлов.
Я сделал следующее, и когда существует более одного файла, команда «more» включает имя файла в качестве заголовка.
или для общего случая
источник
more <FILES> | cat
Это напечатает полное имя файла (включая путь), а затем содержимое файла. Он также очень гибкий, так как вы можете использовать -name "expr" для команды find и запускать столько файлов, сколько вам нужно для файлов.
источник
grep
. Использовать сbash
:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
Мне нравится этот вариант
Вывод выглядит так:
источник
Вот как я обычно работаю с форматированием:
Я обычно отправляю кота в grep для конкретной информации.
источник
for i in *
не будет включать подкаталоги.И недостающее решение awk:
источник
1
в конце выражения?Вы можете использовать эту простую команду вместо цикла for,
источник
Если вам нравятся цвета, попробуйте это:
или:
или: (с установленным пакетом 'multitail')
источник
find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
Если все файлы имеют одинаковое имя или могут быть сопоставлены
find
, вы можете сделать (например):найти, показать путь и кошку каждого файла.
источник
Вот действительно простой способ. Вы сказали, что хотите кошку, что означает, что вы хотите просмотреть весь файл. Но вам также нужно напечатать имя файла.
Попробуй это
head -n99999999 *
илиhead -n99999999 file1.txt file2.txt file3.txt
надеюсь, это поможет
источник
head -n -0 file.txt file2.txt file3.txt
. Работаетhead
в GNU coreutilsЭтот метод напечатает имя файла, а затем содержимое файла:
Вывод:
источник
-f
полезно, если вы хотите отслеживать файл, в который записывается, но на самом деле не в рамках того, что запросил OP.Если вы хотите заменить эти уродливые ==> <== на что-то еще
объяснение:
tail -n +1 *.txt
- вывести все файлы в папку с заголовкомsed -e 's/==>/\n###/g' -e 's/<==/###/g'
- заменить==>
на новую строку + ### и<==
просто ###>> "files.txt"
- вывести все в файлисточник
источник
Если вы хотите получить результат в том же формате, что и желаемый результат, вы можете попробовать:
Результат:
Вы можете поставить
echo -e
до и после разреза, чтобы у вас также был интервал между линиями:Результат:
источник
for
цикл проходит по спискуls
командой.$ ls file{1..3}.txt
Результат:file1.txt file2.txt file3.txt
каждая итерация будет строка , то она поступает в команду , где я в качестве разделителя полей , который разбивает fileX.txt на две части и печатает field1 (field2 является TXT) Остальное должно быть ясноecho
$file
cut
.
... на тех, кто уже упомянул голову, работает для некоторых из нас:
Мне нужно прочитать первую строку; как уже отмечалось, если вы хотите более 10 строк, вам нужно будет добавить опции (head -9999 и т. д.).
Извините за публикацию производного комментария; У меня нет достаточного количества уличных кредитов, чтобы комментировать / добавлять чьи-либо комментарии.
источник
Для решения этой задачи я обычно использую следующую команду:
Это очень удобный способ объединения файлов, если количество файлов достаточно велико.
источник
Сначала я создал каждый файл: echo 'information'> file1.txt для каждого файла [123] .txt.
Затем я распечатал каждый файл, чтобы убедиться, что информация верна: tail file? .Txt
Затем я сделал это: хвостовой файл? .Txt >> Mainfile.txt. Это создало файл Mainfile.txt для хранения информации каждого файла в главном файле.
кот Mainfile.txt подтвердил, что все в порядке.
==> file1.txt <== bluemoongoodbeer
==> file2.txt <== awesomepossum
==> file3.txt <== hownowbrowncow
источник