1

В следующей структуре каталогов:

directory1
-subdirectoryA
--- fileA.txt
-subdirectoryB
--- fileB.txt
subdirectoryC
--- fileC.txt

Я хотел бы создать текстовый файл, содержащий следующий текст:

имя подкаталога A
-текст, содержащийся в файле A.txt
имя подкаталога B
-текст, содержащийся в файле B.txt
имя подкаталога C
-текст, содержащийся в fileC.txt

Мне удалось использовать следующие команды для объединения содержимого текстовых файлов, но для справки мне нужно имя каталога:

find ./prefix_common_to_all_target_directories* -name "*.txt" -exec cat '{}' \; > concatenated_extracted_info.txt

1 ответ1

1
#!/bin/bash
while read mydir; do
    echo "${mydir}:" >> output.txt
    cat $mydir/*.txt >> output.txt
done < <(find test* -type d )

Это перебирает все каталоги внутри directory1 и делает именно то, что вы хотите. Пожалуйста, обратите внимание, что вы должны запустить этот скрипт в directory1 .


Некоторые объяснения:

Сначала запускается find test* -type d которая печатает имя каждого подкаталога в каждой строке. Этот выход затем подается в read mydir работает все , что в то while цикла один раз для каждой строки $mydir присваивается каждой строке (ака subdirectoy имя)).
Затем в первой строке цикла записывается имя каталога, за которым следует двоеточие, в output.txt , используя >> что означает "добавить в файл" (если файл не существует, он будет создан).
Вторая строка в цикле записывает содержимое каждого файла *.txt в подкаталоге в output.txt , снова в «append-mode».


Моя тестовая установка (с вышеупомянутым скриптом, сохраненным как createfile.sh):

$ ls *
test1:
fileA.txt

test2:
fileB.txt

test3:
fileC.txt
$ bash createfile.sh
$ cat output.txt 
test1:
file content from dir1
test2:
test content from dir2
test3:
test content from dir3

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .