Я хотел бы объединить свои файлы. я использую
cat *txt > newFile
Но у меня почти 500000 файлов и он жалуется, что
argument list is too long.
Есть ли эффективный и быстрый способ объединить полмиллиона файлов?
Спасибо
Я хотел бы объединить свои файлы. я использую
cat *txt > newFile
Но у меня почти 500000 файлов и он жалуется, что
argument list is too long.
Есть ли эффективный и быстрый способ объединить полмиллиона файлов?
Спасибо
Если ваша структура каталогов неглубокая (нет подкаталогов), вы можете просто сделать:
find . -type f -exec cat {} \; > newFile
Если у вас есть подкаталоги, вы можете ограничить поиск верхним уровнем или рассмотреть возможность размещения некоторых файлов в подкаталогах, чтобы не возникало этой проблемы!
Это не особенно эффективно, и некоторые версии find позволяют:
find . -type f -exec cat {} \+ > newFile
для большей эффективности. (Обратите внимание, что обратная косая черта перед +
не обязательна, но мне кажется, что это хорошо для симметрии с предыдущим примером.)
-name
. Например, если вам нужны только файлы .txt, используйте find . -name '*.txt' ...
. Подробности смотрите в документации по find
.
- person William Pursell; 09.09.2013
for i in ls;do cat $i >> newFile
по 10 files
каждому 10GB
дает 50 seconds
прибыли последнему подходу; тестовый пример, выполненный на сервере с одним узлом (2.1 GHz, single processor; Intel Xeon, 4 cores)
.
- person knowone; 18.06.2018
Как насчет того, чтобы сделать это в цикле:
for a in *.txt ; do cat $a >> newFile ; done
Недостатком этого является создание нового экземпляра cat
для каждого файла, что может быть дорогостоящим, но если файлы достаточно велики, накладные расходы ввода-вывода должны доминировать над временем ЦП, необходимым для создания нового процесса.
Я бы порекомендовал создать файл, содержащий файлы в правильном порядке, я не уверен на 100% в гарантиях использования таких подстановок (и таких, как в вопросе).
cat
при использовании с find
.
- person knowone; 18.06.2018
for a in *.txt ; do cat $a; done > newFile
- person db-inf; 11.12.2020