LinuxForum.Fans
Тема

Объединить текстовые файлы из большого числа каталогов в один файл|cat

Автор: valet 25 сообщений 9013 просмотров
#261242

Есть большое количество каталогов, в каждом из которых имеются текстовые файлы. Нужно объединить все эти текстовые в один файл.
Если бы все они были в одном каталоге, выполнялось бы элементарно:

text
cat * > all_text

Думаю надо как-то через find делать, а может и проще как-то можно...

#261245

[console=user] for i in dir1 dir2 dir3; do cat "$i/*.txt* >> result.txt; done[/console]
или через find: [console=user]find . -name ".txt" -exec cat {} \; >> result.txt[/console]
Как-то так.

#261246
yars написал:
[console=user] for i in dir1 dir2 dir3; do cat $i >> result.txt; done[/console]

Ага, а если этих dir1 dir2 dir3 100500 как у меня собственно и есть... :)

#261248

cat dir1/* dir2/* dir3/* | grep -v "reg ex error" >> result.txt
избавляемся от избыточности

add// Вы же этого и хотите, чтоб было 100500 в одном файле

какой формат записи (имена) имеют эти 100500 директорий?

#261250
"moshell" написал:
add// Вы же этого и хотите, чтоб было 100500 в одном файле

Вы меня не поняли, я имею ввиду что этих каталогов dir1/* dir2/* dir3/* у меня очень много. Я же не могу вручную расписать dir1/* ... dir100500/* :)

#261252
"moshell" написал:
какой формат записи (имена) имеют эти 100500 директорий?

совсем разные - никакой закономерности.

#261254
valet написал:
[quote="moshell"]какой формат записи (имена) имеют эти 100500 директорий?

совсем разные - никакой закономерности.[/quote]
совсем совсем что регвыражения не подцепить?

#261258

Эти каталоги по всей файловой системе разбросаны? Или все они внутри одного каталога?

#261259

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

#261260
"moshell" написал:
совсем совсем что регвыражения не подцепить?

ну конкретно в даном случае у меня каталоги в формате *.site.ru - то есть каталоги, названные поддоменами конкретного домена site.ru и здесь действительно можно их регвыражением схватить...

Но хотелось бы найти универсальный способ, потому что не первый раз возникает подобная задача - и не знаю как это реализовывать.

#261261

"yars" написал:
Эти каталоги по всей файловой системе разбросаны? Или все они внутри одного каталога?
в одном каталоге конечно, иначе вопрос не имел бы смысла :) получалось бы из разряда "сам не знаю, что хочу".
#261262

"moshell" написал:
судя по всему, из контекста, все они в одной директории, иначе нелогично как то получается разбрасывать однотипные файлы по всему дереву
да, все эти каталоги сами находятся в одном каталоге!
#261266

for i in $( ls | grep ".*site.ru$" ); do
cat $i/* >> result.txt
done

#261268

у меня работает

gu@moshell:~$ ls
123ddd 567ddd pictures playlist.m3u result.txt script
gu@moshell:~$ ls 123ddd/ 567ddd/
123ddd/:
123

567ddd/:
123
gu@moshell:~$ cat 123ddd/123 567ddd/123
lskdjfldjflskjfd
11111
gu@moshell:~$ cat script
#!/bin/bash
cd /home/gu
for i in $( ls | grep ".*dd$" ); do
cat $i/* >> /home/gu/result.txt
done

exit 0
gu@moshell:~$ ./script
gu@moshell:~$ cat result.txt
lskdjfldjflskjfd
11111
gu@moshell:~$
#261269
"moshell" написал:
for i in $( ls | grep ".*site.ru$" ); do
cat $i/* >> result.txt
done

Да, спасибо, ваш вариант работает.

Но я сделал даже проще:

for i in *; do cat $i/* >> result.txt; done
Все потому что все эти каталоги сами находятся в одном каталоге :)
#261270

в командной строке оно конечно хорошо. но вы ведь часто сталкиваетесь с этим как писали.
поэтому лучше сделать скрипт, положить его в волшебную директорию, и уже в консоли набирать одно слово а не толпу слов.
под ваши желания можно и кастыль замутить
скопировать все эти файлики в одну директорию, и уже оттуда

valet написал:
text
cat * > all_text

хД

//add почему я избыточный код написал? откуда я знаю что там еще помимо этих файлов в вашей директории?
вдруг там какая нибудь best_of_bash.org.ru/ находится? :)

#261304

Да что ж вы жизнь-то усложняете? Все ж гораздо проще!
[console]
cat */* > all_text
[/console]
Это если все 100500 каталогов находятся в одном. Если там еще и вложенность каталогов один в другой over9000, то да, надо усложнять жизнь.

#261340
bobr написал:
Да что ж вы жизнь-то усложняете? Все ж гораздо проще!
[console]
cat */* > all_text
[/console]
Это если все 100500 каталогов находятся в одном. Если там еще и вложенность каталогов один в другой over9000, то да, надо усложнять жизнь.

ну да. глоббинг никто не отменял.
ваш метод годится в идеальном частном случае.
а если там чёрт ногу сломает?
и мухи и котлеты в одном флаконе?
потом разбирай, откуда в логах "Маша, яйца купить?"

#261400
"bobr" написал:
Это если все 100500 каталогов находятся в одном. Если там еще и вложенность каталогов один в другой over9000, то да, надо усложнять жизнь.

если их там 100500, то просто работать не будет... скажет «больно много аргументов; я так не могу сынок; пшёл нафиг». уже не раз проходили...

#262229

как это не будет работать?

gu@moshell:~$ cat script
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 100500 ]; do
echo "The counter is $COUNTER" > digit/$COUNTER.txt
let COUNTER=COUNTER+1
done

exit 0
gu@moshell:~$ ls digit/* | wc -l
100500
gu@moshell:~$ cat digit/* > all.txt
gu@moshell:~$ cat all.txt | wc -l
100500
gu@moshell:~$
Войдите или зарегистрируйтесь, чтобы ответить.