Допустим, у меня есть каталог под названием /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 \;


