Скрипт Bash для циклического перебора папок и вывода списка файлов в текст

Скрипт Bash для циклического перебора папок и вывода списка файлов в текст

Я могу сделать это с помощью скриптов Windows CMD, но сейчас я перехожу в Debian через Raspberry Pi.

Я бы хотел сделать следующее...

(В текущей папке)

  • Для каждой подпапки...
    • Создайте файл с именем original_filenames.txt
    • Вывести имя папки в файл original_filenames.txt
    • Перечислить все файлы (включая все подпапки) в файле original_filenames.txt

решение1

Использование цикла оболочки:

for dir in */; do
    { printf '%s\n' "$dir"
      ( cd "$dir" && find . )
    } >"$dir/original_filenames.txt"
done

Это перебирает все подкаталоги в текущем каталоге. Тело цикла выводит имя каталога, а затем список всех файлов и каталогов, рекурсивно, в этом каталоге. Этот вывод идет в файл original_filenames.txtв каталоге.

Короче:

for dir in */; do
    find "$dir" >"$dir/original_filenames.txt"
done

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

Если вас не интересуют имена каталогов и вам нужны только пути к обычным файлам, используйте findwith -type fпосле имени каталога.


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

решение2

Это можно сделать с помощью findкоманды и execопции — примерно так:

find . -type d \( ! -name . \) -exec bash -c '
    dirname=$(basename "{}") && 
    cd "{}" && 
    echo "{}" > original_filenames.txt && 
    ls | grep -Fv original_filenames.txt >> original_filenames.txt
' \;

Вот пост на StackOverflow, который может оказаться вам полезным:

Связанный контент