Введите дочерний каталог и перечислите его подкаталоги в скрипте bash
Я только начинаю изучать bash-скрипт и у меня есть вопрос, на который я не могу найти ответ. В настоящее время я нахожусь в каталоге с именем lab2. Внутри этого каталога у меня есть еще один каталог "Students", который содержит каталоги, названные в честь каждого студента. Как ~/lab2/ Students / Johndoe. Так что внутри учеников много каталогов. Мой сценарий находится в каталоге lab2, и мне нужно написать сценарий для распечатки имен каталогов внутри каталога студентов (и, конечно, мне нужно использовать относительные пути).... Как мне это сделать? Я попробовал несколько вещей, одна из которых
$MYDIR="$PWD/students"
DIRS=`ls -l . | egrep '^d' | awk '{print $8}'`
for DIR in $DIRS
do
echo ${DIR}
done
но это не сработало.... спасибо!
3 ответа
$MYDIR="$PWD/students"
но это не сработало...
Это неудивительно - правильный синтаксис
MYDIR="$PWD/students"
(без ведущих $
).
Проверьте, помогает ли следующее:
find ~/lab2/students -type d -maxdepth 1
И в случае, если вы хотите только имена каталогов (имена студентов):
find ~/lab2/students -maxdepth 1 -type d | awk -F/ '{print $NF}'
Пожалуйста, прочитайте справочную страницу find
, это очень поможет.
awk -F/ '{print $NF}' is filtering the last field.
И если вы хотите что-то с этими именами каталогов в вашем bash-скрипте, вы можете сделать что-то вроде:
#!/bin/bash
for file in $(find ~/lab2/students -maxdepth 1 -type d) #or you can use the awk one here
do
echo $file
#your stuff here
done
Развивая ответ @Jord, вы можете использовать find
с некоторыми опциями для получения очень тонкого контроля над выводом:
-mindepth
а также-maxdepth
контролировать глубину рекурсии (которая по умолчанию равна 0).-type d
перечисляет только каталоги.-printf %f
печатает имя каталога (или файл, или символическую ссылку и т. д.) без ведущих каталогов.
man find
имеет больше информации, и info --raw-escapes --subnodes find | less --raw-control-chars
имеет полную информацию.