mac: объединить содержимое текстовых файлов во многих каталогах; добавить имена каталогов к соответствующему содержимому текстового файла

318
goober grape

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

directory1
-subdirectoryA
--- fileA.txt
-subdirectoryB
---
подкаталог
fileB.txtC --- fileC.txt

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

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

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

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

1 ответ на вопрос

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

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


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

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


Моя тестовая настройка (с сохраненным выше скриптом 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 
благодарю вас! это сработало отлично! Теперь выясню почему;) goober grape 5 лет назад 0
@goobergrape Я добавил объяснение и упростил код. Если мой ответ помог вам, я был бы признателен, чтобы вы приняли его («✓» слева). :) confetti 5 лет назад 0
Вау, это невероятно полезно и ценится! Спасибо за объяснение. Я проверил согласие, спасибо также за то, что сообщили мне об этом. Ура! goober grape 5 лет назад 1