#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 теперь файлы читаются (и записываются) по (алфавитному) порядку.
Комментариев нет:
Отправить комментарий