2013-05-15 3 views
1

У меня есть несколько (60 000) файлов в папке, которые необходимо объединить в 3 отдельных файла. Как я мог бы сделать это так, чтобы каждый файл содержал содержимое ~ 20 000 из этих файлов?Кошка несколько тысяч файлов

Я знаю, что это было бы похоже на петлю:

for i in {1..20000} 
do 
cat file-$i > new_file_part_1 
done 
+0

Должны ли ваши выходные файлы содержать содержимое последовательных входных файлов (например, output1 содержит input1, input2, ..., input20000)? –

+1

Предупреждение '{1..2000}' - трюк zsh. Предпочитаю '\' seq 1..20000 \ '' – Vash2593

+3

@ Vash2593: это совершенно верно Bash. Это неверно в оболочке Bourne, но это не то, что он использует. ('seq', с другой стороны, специфичен для GNU.) – Cairnarvon

ответ

5

Выполнение:

cat file-$i > new_file_part_1 

усечет new_file_part_1 каждый раз, когда цикл повторяется. Вы хотите добавить в файл:

cat file-$i >> new_file_part_1 
+0

Это было именно оно! Спасибо Kind Sir – Jcrow06

+2

@ Jcrow06 Это любезно нажать на галочку, если вы считаете, что этот ответ решает вашу проблему. – nurettin

+0

Я знаю, что я сожалею, что не позволял мне делать галочку в коробке до определенного срока! – Jcrow06

0

Предполагая, что это не имеет значения, какой входной файл переходит к которому выходной файл:

for i in {1..60000} 
do 
    cat file$i >> out$(($i % 3)) 
done 

Этот скрипт использует оператор по модулю % разделить вход на 3 бункера; он будет генерировать 3 выходных файлов:

  • OUT0 содержит file3, file6, file9 ...
  • out1 содержит file1, file4, file7 ...
  • out2 содержит file2, file5, file8,. ..
4

Другие ответы закрывают и открывают файл на каждой итерации. Я предпочел бы

for i in {1..20000} 
do 
    cat file-$i 
done > new_file_part_1 

поэтому выход всех cat прогонов по трубам в один файл один раз открытой компании все.

0
#!/bin/bash 

cat file-{1..20000} > new_file_part_1 

Это запускает cat только один раз и открывает и закрывает выходной файл только один раз. Никакой цикл не требуется, поскольку cat может принимать все 20000 аргументов.

Проницательный наблюдатель отметил, что в некоторых системах аргументы 20000 могут превышать лимит системы ARG_MAX. В таком случае можно использовать xargs, за что штраф cat будет запущен более одного раза (но все же значительно меньше 20000 раз).

echo file-{1..20000} | xargs cat > new_file_part_1 

Это работает, потому что, в Bash, echo является оболочкой встроенной и как таковой не подлежит ARG_MAX.

+0

Это может генерировать более длинную командную строку, чем максимально допустимая. – chepner

+1

@chepner: Я изначально включил «xargs» для этого в свой ответ, но удалил его, потому что я почувствовал, что он отвлекся от основной точки моего ответа, которая заключается в том, что использование цикла - лишний дополнительный шаг. Добавление «xargs» к этому тривиально. –

Смежные вопросы