Как запустить цикл во всех каталогах внутри каталога

Как запустить цикл во всех каталогах внутри каталога

Допустим, у меня есть каталог под названием /tmp/main , а внутри него — 100 других каталогов.

Я хочу запустить цикл по каждому каталогу этих каталогов, например, чтобы создать файл сtouch test.txt

Как мне указать скрипту обрабатывать первый, второй, третий и т. д.?

решение1

Подойдет простой цикл:

for dir in /tmp/main/*/; do
    touch "$dir"/test.txt
done

Символ /в конце шаблона /tmp/main/*/гарантирует, что если шаблон чему-либо соответствует, то он будет соответствовать каталогу.

В bash, вы можете захотеть установить nullglobопцию оболочки с shopt -s nullglobперед циклом, чтобы гарантировать, что цикл вообще не будет запущен, если шаблон не соответствует ничему. Без nullglobустановки цикл все равно будет запущен один раз с нераскрытым шаблоном в $dir. Другой способ исправить это — убедиться, что $dirэто действительно каталог перед вызовом touch:

for dir in /tmp/main/*/; do
    if [ -d "$dir" ]; then
        touch "$dir"/test.txt
    fi
done

или, что то же самое,

for dir in /tmp/main/*/; do
    [ -d "$dir" ] && touch "$dir"/test.txt
done

решение2

Вы можете использовать find:

find /tmp/main -type d -exec touch {}/test.txt \;

А если вы хотите исключить папку /tmp/mainиз результатов findиспользования:

find /tmp/main ! -path /tmp/main -type d -exec touch {}/test.txt \;

или

find /tmp/main -mindepth 1 -type d -exec touch {}/test.txt \;

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