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

Я хочу объединить тысячи небольших текстовых файлов в один большой текстовый файл. Я имею их в каталогах со структурой: 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 ) ,

  • Ctrl + D для вывода конечной линии
  • Резервное копирование по неправильному жесткому диску
  • Обратная последовательность файла с инструментами POSIX?
  • тайм-аут вызывает, когда цикл чтения заканчивается, когда `cat` отключен
  • Почему следующая последовательность оболочек заканчивается так быстро?
  • Как назначить вывод cat сценария bash переменной в другом скрипте
  • Файлы Concat 1000 в каталоге
  • файл (vdi) увеличивается (при двойном) размере после раскола, а затем работает кошка
  • Как объединить файлы с fastzipped fastq?
  • команды трубопровода работают не так, как ожидалось Мне нужно объяснение
  • Вычитание двоичных файлов
  • Linux и Unix - лучшая ОС в мире.