Я хочу, чтобы мой сценарий оболочки посещал все подкаталоги в главном каталоге. Сделайте что-нибудь в каталогах, отправьте вывод в буферный файл и перейдите к следующему каталогу. Рассмотрим Main Dir = / tmp Sub Dir = ABCD (четыре подкаталога)
Я хочу, чтобы мой сценарий оболочки посещал все подкаталоги в главном каталоге. Сделайте что-нибудь в каталогах, отправьте вывод в буферный файл и перейдите к следующему каталогу. Рассмотрим Main Dir = / tmp Sub Dir = ABCD (четыре подкаталога)
Ответы:
Используйте for
цикл:
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
Он ищет только подкаталоги каталога /path/to/dir
. Обратите внимание, что простой пример, приведенный выше, потерпит неудачу, если имена каталогов содержат пробелы или специальные символы. Более безопасный подход:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
Или просто bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(обратите внимание, что в противоположность find
этому также рассматриваются символические ссылки на каталоги и исключаются скрытые)
find
как это.
date +"%m%d20%Y"
| xargs echo echo $ д
date +"%m%d20%Y"
| xargs echo echo $ d Ожидаемый результат - ls -ltr из всех подкаталогов , Вышеупомянутая петля не работает
Я полный bash
новичок, но ветеран UN * X. Хотя, несомненно, это можно сделать в сценариях оболочки Bash, в прежние времена мы привыкли find [-maxdepth <levels>] <start-dir> -exec <command> ;
к этому. Вы могли бы сделать man find
и поиграть, возможно, пока кто-то не скажет вам, как это сделать в bash
!
find
команды.
$(find...)
Вещь плохая практика .
Похоже, вы хотите имена файлов под каждым из подкаталогов; что ls -l | awk
недостаточно надежно, для чего, если эти имена файлов содержат пробелы и / или символы новой строки? Нижеследующее find
будет работать даже для find
тех, у кого не получилось -maxdepth
:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
Также возможно использование ls, grep и tr
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
du / sed также может быть использован как селектор, если у вашего ls нет вышеупомянутых опций
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
Может быть важно отметить, что эти примеры возвращают скрытые каталоги и исключают родительские и текущие каталоги
ls
записывает по одному файлу на строку (что -1
указывает опция) по умолчанию, когда стандартный вывод представляет собой канал (так что это лишнее в ваших ответах). (2) Анализ выходных данных ls
является плохой идеей - посмотрите на это и на это . Ваш первый ответ потерпит неудачу, если в именах каталогов есть пробелы (или новые строки), и все они потерпят неудачу, если в их именах будут новые строки. (3) Вы должны всегда заключать в кавычки переменные оболочки (например, "$dir"
), если у вас нет веских причин не делать этого, и вы уверены, что знаете, что делаете.