1

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

cat * > all_text

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

2 (26.06.2012 21:54:37 отредактировано yars)

 Консоль: user
[user@linuxforum.tech ~]$ for i in dir1 dir2 dir3; do cat "$i/*.txt* >> result.txt; done

или через find:
 Консоль: user
[user@linuxforum.tech ~]$ find . -name ".txt" -exec cat {} \; >> result.txt

Как-то так.

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

3

yars пишет:

 Консоль: user
[user@linuxforum.tech ~]$ for i in dir1 dir2 dir3; do cat $i >> result.txt; done

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

4 (26.06.2012 21:52:49 отредактировано moshell)

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

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

5

moshell пишет:

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

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

6

moshell пишет:

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

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

7

valet пишет:
moshell пишет:

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

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

совсем совсем что регвыражения не подцепить?

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

8

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

9

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

10 (26.06.2012 22:01:14 отредактировано valet)

moshell пишет:

совсем совсем что регвыражения не подцепить?

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

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

11

yars пишет:

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

в одном каталоге конечно, иначе вопрос не имел бы смысла ab получалось бы из разряда "сам не знаю, что хочу".

12

moshell пишет:

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

да, все эти каталоги сами находятся в одном каталоге!

13

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

14

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

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:~$

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

15

moshell пишет:

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

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

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

for i in *; do cat $i/* >> result.txt; done

Все потому что все эти каталоги сами находятся в одном каталоге ab

16 (26.06.2012 22:36:22 отредактировано moshell)

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

valet пишет:
cat * > all_text

хД

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

17

Да что ж вы жизнь-то усложняете? Все ж гораздо проще!

 Консоль:

cat */* > all_text

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

Йа тьомный эльф

18 (27.06.2012 10:17:20 отредактировано moshell)

bobr пишет:

Да что ж вы жизнь-то усложняете? Все ж гораздо проще!

 Консоль:

cat */* > all_text

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

19 (27.06.2012 15:39:47 отредактировано Fat-Zer)

bobr пишет:

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

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

95% процентов проблем находятся между клавиатурой и стулом.

20

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

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:~$

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

21

moshell пишет:

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

 Консоль:

alexander@goblin /tmp/1 $ for I in {1..100500}; do echo $I >"quite_long_name_$I"; done
alexander@goblin /tmp/1 $ cat *
bash: /bin/cat: Слишком длинный список аргументов

95% процентов проблем находятся между клавиатурой и стулом.

22

ах да.
там же вложенные папки должны быть.
вот

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

exit 0
gu@moshell:~$ cd digit/
gu@moshell:~/digit$ ls | wc -l
100500
gu@moshell:~/digit$ cat */* > ~/all.txt
gu@moshell:~/digit$ cd
gu@moshell:~$ cat all.txt | wc -l
100500
gu@moshell:~$

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

23

gu@moshell:~$ cat /proc/cpuinfo | grep mips
bogomips        : 4585.45
bogomips        : 4584.94
bogomips        : 4584.95
bogomips        : 4584.95
gu@moshell:~$ uname -a
Linux moshell 3.2.0-2-amd64 #1 SMP Mon Jun 11 17:24:18 UTC 2012 x86_64 GNU/Linux
gu@moshell:~$
"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

24

moshell,
а так (увеличим длину параметров после глобинга)

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

?

25

я не понял. речь об чем шла?
о 100500 файлах или об чем?

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс