Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

Как объединить 60000 файлов в один файл?

#bash #unix #объединение


В директории есть порядка 60000 текстовых файлов, их надо объединить в один файл.

Команда:

cat * > all.txt


не срабатывает:

-bash: /bin/cat: Argument list too long


Попробовал через:

find ./ -name '*.txt' | xargs grep '' > ../all.txt


но столкнулся с тем, что в all.txt записывается и путь, и название файла:

.//file1.txt:row1
.//file1.txt:row2
...


Какие еще могут быть варианты?
    


Ответы

Ответ 1



touch ../all.txt find ./ -name "*.txt" | xargs cat >> ../all.txt То есть cat каждого файла по отдельности, а не сразу всех в одной команде cat.

Ответ 2



воспроизводим ситуацию (у меня получилось с чуть большим количеством файлов): $ for i in $(seq 1 600000); do echo $i > $i.txt; done $ ls | wc -l 600000 $ cat *.txt > spisok bash: /bin/cat: Argument list too long будем добавлять содержимое в файл, который не подпадает под маску *.txt — это полезное условие, которое помогает избежать некоторых неприятностей. очень быстро и наиболее оптимально, вероятно, сделать примерно так (wc -l файл — это подсчёт количества строк в файле): $ find -name \*.txt -exec cat {} > spisok + $ wc -l spisok 600000 spisok $ head -n 3 spisok 200784 59591 584250 хм. файлы читались явно не по алфавитном порядку. если так не пойдёт, то придётся применить менее оптимальное решение с сортировкой и командой xargs: $ find -name \*.txt | sort | xargs -I{} cat {} > spisok $ wc -l spisok 600000 spisok $ head -n 3 spisok 100000 100001 100002 теперь файлы читаются (и записываются) по (алфавитному) порядку.

Комментариев нет:

Отправить комментарий