Большое количество конкатенации файлов - PullRequest
2 голосов
/ 04 августа 2011

У меня около 3-4 миллионов файлов в каталоге, имя которого заканчивается, скажем, type1.txt, type2.txt. (файл 1type1.txt, 1type2.txt,2type2.txt,2type2.txt и т. Д.)

Теперь я хочу объединить все файлы, заканчивающиеся на type1.txt & type2.txt.

В настоящее время я делаю cat *type1.txt > allTtype1.txt аналогично для type2.txt. Я хотел сохранить порядок в обоих выходных файлах, я думаю, что cat делает это. Но это слишком медленно.

Пожалуйста, предложите более быстрый способ сделать то же самое.

Спасибо, Рави

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

Вы можете сделать это с помощью этой команды:

ls | while read file; do cat $file >> allTtype${file#*type}; done

Но, как сказано выше в его ответе, каждый раз, когда cat нужно открыть файл, он должен будет выполнить поиск по индоду, который бызанять много времени в каталоге с большим количеством файлов.Чтобы попытаться ускорить процесс, вы можете выполнить сортировку по индоду, используя icat из Sleuth Kit :

ls -i | while read -a file_array; do icat /dev/sda1 ${file_array[0]} >> allTtype${file_array[1]#*type}; done

И, что еще лучше, вы можете поместить полученные файлыв другом каталоге:

ls -i | while read -a file_array; do icat /dev/sda1 ${file_array[0]} >> /newdir/allTtype${file_array[1]#*type}; done
1 голос
/ 04 августа 2011

cat само по себе не медленно.Но каждый раз, когда вы раскрываете подстановочный знак оболочки (? И *), оболочка будет читать и искать по всем именам файлов в этом каталоге, что очень медленно.

Также ядру потребуется время, чтобы найти файлкогда вы открываете его по имени, чего вы не можете избежать.Это зависит от используемой файловой системы (не указана в вопросе): некоторые файловые системы более интеллектуальны с огромными каталогами, чем другие.

Чтобы разобраться в этом, вам может быть полезно получить список файлов один раз :

ls > /tmp/filelist

... и затем с помощью grep или аналогичного для выбора файлов из этого списка:

cat `grep foo /tmp/filelist` > /out/bar

После того, как вы разобрались в этом беспорядке, сделайтеОбязательно структурируйте хранилище / приложение таким образом, чтобы это больше никогда не повторилось.:) Также убедитесь, что rmdir существует существующий каталог после того, как вы извлекли из него ваши файлы (повторное использование его для любых целей не будет эффективным, даже если в нем есть только один файл).

...