Поведение bash
умолчанию "globbing" (подстановка / расширение подстановочных знаков) состоит в том, чтобы возвращать само выражение подстановочного знака, если подстановочный знак ничего не соответствует. Так что если вы cd
- диск в каталог , который не имеет подкаталоги, вы в конечном итоге пытается cd
в буквальном смысле «* /» (буквально каталог, имя которого звездочка), и это не получится , так что вы будете оставаться один каталог выше чем вы думали, что окажетесь в этой точке цикла. Поэтому, когда вы cd ..
, вы снова окажетесь на один каталог выше. В конце концов вы вернетесь на корневой уровень вашей файловой системы.
Многие сценарии оболочки предпочитают использовать find(1)
а не циклы оболочки, когда они хотят, чтобы скрипт прошел по дереву каталогов. Весь ваш фрагмент сценария станет:
find . -type d
... или, если вы действительно хотели абсолютные пути, а не относительные пути:
find "$PWD" -type d
Если вы хотите придерживаться циклов оболочки для этого, вы можете попробовать что-то вроде этого:
#!/bin/bash
set -evx
for dir in */; do
if [ -d "$dir" ]; then
cd "$dir"
for dir2 in */; do
if [ -d "$dir2" ]; then
cd "$dir2"
ls -d "$PWD"/*
cd ..
fi
done
cd ..
fi
done
Обратите внимание, как я использовал операторы if
для проверки каждого значения dir
и dir2
чтобы убедиться, что они действительно являются каталогами, и я пропускаю их, если это не так.
Также обратите внимание на строку set -evx
, которая представляет собой хороший набор опций, которые нужно установить, когда вы впервые пишете / отлаживаете скрипт:
-e
останавливается на первой ошибке.
-v
печатает каждую строку перед тем, как ее выполнить.
-x
печатает каждую строку после выполнения всех различных подстановок / расширений перед ее выполнением.
Также подумайте о том, чтобы потратить некоторое время на справочной странице bash(1)
рассматривая такие параметры оболочки, как nullglob
и failglob
, если вам не нравится поведение по умолчанию для подстановки, когда возвращается само подстановочное выражение, когда оно не соответствует никому.