Множество текстовых файлов в один большой текстовый файл

Я хочу объединить тысячи небольших текстовых файлов в один большой текстовый файл. Я имею их в каталогах со структурой: timestamp1/status.txt . Например: 20130430133144/status.txt . До сих пор я знаю, что

 cat */* > bigtextfile.txt 

работает для небольшого количества файлов. Но будет ли это работать на более высокие цифры? Интересно, собирается ли cat собирать содержимое всех файлов, а затем попытаться сохранить bigtextfile . В противном случае, я полагаю, должен быть другой способ сделать это, например, извлечь один файл, добавить его в bigtextfile , затем извлечь другой и так далее.

3 Solutions collect form web for “Множество текстовых файлов в один большой текстовый файл”

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

Однако, если у вас есть большое количество файлов, вы можете столкнуться с проблемой с количеством аргументов, переданных cat . По умолчанию ядро ​​linux допускает передачу фиксированного количества аргументов в любую программу (я не помню, как получить значение, но его несколько тысяч в большинстве случаев).
Чтобы решить эту проблему, вы можете сделать что-то вроде этого:

 find -mindepth 2 -maxdepth 2 -type f -exec cat {} \; > bigtextfile.txt 

Это в основном вызовет cat отдельно для каждого файла, найденного find .

В:

 cat */* > bigtextfile.txt 

Оболочка будет расширять */* в отсортированный список (не скрытых) файлов соответствия и будет выполнять cat с этими путями файлов в качестве аргументов.

cat откроет каждый файл по очереди и напишет на его stdout то, что он читает из файла. cat не будет содержать больше одного буфера, заполненного данными (что-то вроде нескольких килобайт байтов) за раз в памяти.

Проблема, с которой вы можете столкнуться, состоит в том, что список аргументов для cat настолько велик, что он достигает предела размера аргументов execve() вызова execve() . Таким образом, вам может понадобиться разделить этот список файлов и запустить cat несколько раз.

Вы можете использовать xargs для этого (здесь с GNU или BSD xargs для нестандартных опций -r и -0 ):

 printf '%s\0' */* | xargs -r0 cat -- > big-file.txt 

(потому что printf встроен в оболочку, он не проходит через системный вызов execve , поэтому не через его предел).

Или find файл списка и запустите как можно больше команд кота:

 find . -mindepth 2 -maxdepth 2 -type f -exec cat {} + > big-file.txt 

Или переносимо:

 find . -path './*/*' -prune -type f -exec cat {} + > big-file.txt 

(будьте осторожны, хотя это противоречит */* , оно будет включать скрытые файлы (и файлы в скрытых каталогах), не искать файлы в символических ссылках в каталоги, а список файлов не будет сортироваться).

Если в последней версии Linux вы можете снять ограничение по размеру аргументов, выполните следующие действия:

 ulimit -s unlimited cat -- */* > big-file.txt 

С помощью zsh вы также можете использовать zargs :

 autoload zargs zargs -- */* -- cat > big-file.txt 

С помощью ksh93 вы можете использовать command -x :

 command -x cat -- */* > big-file.txt 

Все они делают то же самое, разбивают список файлов и запускают как можно больше команд cat .

С ksh93 снова вы можете обойти ограничение execve() , используя встроенную команду cat :

 command /opt/ast/bin/cat -- */* > big-file.txt 

Если количество файлов слишком велико, */* даст слишком большой список аргументов. Если да, то что-то по строкам будет делать:

 find . -name "*.txt" | xargs cat > outfile 

(идея состоит в том, чтобы использовать find для find имен файлов и превращения их в поток; xargs прерывает этот поток до управляемых частей, чтобы дать cat , который объединяет их в выходной поток xargs и выходит в outfile ) ,

  • apt - опция командной строки 'i' не понята в сочетании с другими параметрами
  • cat: write error: Недопустимый аргумент
  • Показывать все файлы из каталога с кошкой одновременно.
  • Как включить переменную в документ здесь?
  • Как сказать команде «cat» не висеть, когда нет пути?
  • bash - добавить пустую строку в heredoc через переменную
  • Как вы используете перенаправление вывода в сочетании с здесь-документами и кошкой?
  • Почему эта команда создает чрезвычайно большой файл?
  • Почему следующая последовательность оболочек заканчивается так быстро?
  • Как перемещать файлы с тем же именем и объединяться
  • Разница между «cat <file.txt» и «echo <file.txt»
  • Является ли cat единственной надежной командой, которая может считывать данные из последовательного интерфейса?
  • Interesting Posts

    sed – удалить unmatched "}", ")" или "]" (только для рассматриваемой строки)

    Bash – оболочка vs переменная среды

    Что делает недокументированный аргумент командной строки «proto» в auditdistd для FreeBSD?

    Запуск SSH SOCKS5 прокси при запуске системы

    Как рекурсивно добавлять нули в имя файла

    Большой rsync – нажмите или потяните?

    Используя cURL, как я могу получить числовую строку, содержащую запятые и пробелы, и преобразовать их в строку NON COMAFIED

    Изменение паролей root с помощью setuid

    Перемещение книг Орды, RoundCube и SquirrelMail

    Файловый менеджер Thunar: Сортировка по сокращенной клавиатуре?

    Есть ли простой способ протоколировать все выполненные команды, включая аргументы командной строки?

    Как запустить скрипт KWin с консоли (чтобы настроить фокус на конкретное окно в KDE)?

    Может ли сценарий bash сбросить и дезинфицировать * всю * среду и как?

    Преобразование целого числа в день недели с использованием даты (1)

    set -u использование не работает как ожидалось

    Linux и Unix - лучшая ОС в мире.