Объединять файлы из разных папок в Bash - PullRequest
0 голосов
/ 14 мая 2018

У меня есть каталог, содержащий 227 подкаталогов, каждый из которых содержит файл с тем же именем (in.BV), которое я хотел бы объединить.

т.е.

Directory
---------Subdirectory1
---------------in.BV various other files
---------Subdirectory2
---------------in.BV various other files

и т. Д.

Эти файлы, называемые in.BV, содержат только текст, и я хотел бы просто объединить их в один длинный текстовый файл.

Я новичок, и это то, что я пробовал до сих пор:

for d in */
do
        (cd $d cat *in.BV >> Newin.txt)
done

Это дало мне бланк Newin.txt. Это превосходит мое нынешнее понимание сценариев bash.

Заранее спасибо!

Richie

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Пример:

root@dib:~# find ./ -type f -name in.BV
./test1/in.BV
./test1/test2/in.BV

Найти с помощью Exec:

root@dib:~# find ./ -type f -name in.BV -exec cat {} + |tee your_new_file.txt
asdf
asdf
0 голосов
/ 14 мая 2018

Если вы находитесь в каталоге Directory:

cat */in.BV >Newin.txt

Если вы находитесь где-то выше Directory:

shopt -s globstar
cat **/in.BV >Newin.txt
shopt -u globstar

Это устанавливает параметр оболочки globstar в bash.С установленным параметром вы можете использовать ** для сопоставления с любым путем (* соответствует только до следующего / в имени пути, но ** соответствует по /).

Послеcat, который создает Newin.txt в текущем каталоге, я отменяю опцию globstar.

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


С новой информацией, приведенной в комментариях ниже (файлы должны быть объединены в порядке в зависимости от имени подкаталога):

Если вы находитесь в Directory:

cat Subdirectory{1..227}/in.BV >Newin.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...