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

Например, у меня есть следующая структура

mydir/a/fileA.txt
mydir/b/fileB.js
mydir/fileC.js
  • fileA.txt content: Im file A
  • fileB.txt content: Im file B
  • fileC.txt content: Im file C

И я хочу объединить содержимое всех файлов в каталоге mydir (рекурсивно) в строку output.txt - перед каждым содержимым файла там должно быть включено эторазделитель (как первая строка) ---next-file->>>: и путь к этому файлу (начиная с mydir / ..), обернутый новыми строками. Таким образом, желаемый результат для приведенного выше примера должен быть

---next-file->>>: mydir/a/fileA.txt

Im file A

---next-file->>>: mydir/b/fileB.js

Im file B

---next-file->>>: mydir/fileC.js

Im file C

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

find mydir/ -exec cat {} \; > output.txt

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Следующее должно быть POSIXly правильно:

find mydir -type f -exec echo -n '---next-file->>>: ' \; -print -exec echo \; -exec cat {} \; -exec echo \; > output.txt

Вы можете попробовать здесь .


Более чистое решение, если вы можете использовать GNU find:

find mydir -type f -printf '---next-file->>>: %p\n\n' -exec cat {} \; -printf '\n' > output.txt

%p в формате -printf относится к относительному пути файла.

Вы можете попробовать здесь .

1 голос
/ 02 октября 2019

Как это?

find mydir/ -type f -exec sh -c '
    for f; do
        printf '--- %s ->>>:\n\n' "$f"
        cat "$f"
        printf '\n'
    done' _ {} +

Это должно создать только один подпроцесс для файла, плюс один для find и один для sh (больше оболочек, если вы найдете больше файлов, чем может find). передать подпроцесс за один раз).

1 голос
/ 02 октября 2019

Для вставки текста между командами cat используйте несколько -exec с.

find -type f -exec echo '---next-file->>>:' {}  \; -exec echo "" \; -exec cat {} \; -exec echo "" \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...