Я пишу скрипт на bash для Linux и мне нужно пройти через все имена подкаталогов в данном каталоге. Как я могу просмотреть эти каталоги (и пропустить обычные файлы)?
Например:
данный каталог /tmp/
имеет следующие подкаталоги:/tmp/A, /tmp/B, /tmp/C
Я хочу получить A, B, C.
Ответы:
Краткое объяснение:
find
находит файлы (вполне очевидно).
является текущим каталогом, который послеcd
является/tmp
(ИМХО это более гибко, чем/tmp
непосредственно вfind
команде. У вас есть только одно место, котороеcd
, чтобы изменить, если вы хотите, чтобы в этой папке выполнялось больше действий)-maxdepth 1
и-mindepth 1
убедитесь, чтоfind
смотрит только в текущем каталоге и не включает.
себя в результат-type d
ищет только каталоги-printf '%f\n
печатает только имя найденной папки (плюс символ новой строки) для каждого нажатия.И вуаля!
источник
while..done
цикла вы можете сходить с ума.find
's-exec
позволяет вам запустить любую команду для каждого файла / каталога.Все ответы до сих пор используют
find
, так что вот один только с оболочкой. Нет необходимости во внешних инструментах в вашем случае:источник
find
когда вы можете добавить косую черту в подстановочный знакfor dir in */; do echo $dir; done
же для каталогов в текущем каталоге.dir=${dir%*/}
иecho ${dir##*/}
делает./tmp/*/
, было бы целесообразно включить проверку, чтобы увидеть, существует ли каталог на самом деле.Вы можете перебрать все каталоги, включая скрытые директории (начиная с точки):
примечание: использование списка
*/ .*/
работает в zsh, только если в папке есть хотя бы один скрытый каталог. В bash это покажет также.
и..
Другая возможность для bash включить скрытые каталоги - использовать:
Если вы хотите исключить символические ссылки:
Чтобы вывести только конечное имя каталога (A, B, C в виде вопроса) в каждом решении, используйте это в циклах:
Пример (это также работает с каталогами, которые содержат пробелы):
источник
Работает с каталогами, которые содержат пробелы
Вдохновленный Сорпигалом
Оригинальный пост (не работает с пробелами)
Вдохновлен Болдевином : пример цикла с
find
командой.источник
источник
basename
. Я бы предпочел это, чем мой ответ.Чаще всего я использую технику
find | xargs
. Например, если вы хотите сделать каждый файл в этом каталоге и все его подкаталоги общедоступными, вы можете сделать следующее:-print0
Вариант заканчивается нулевым символом , а не пространства.-0
Вариант разделяет его вход таким же образом. Так что это комбинация для использования с файлами с пробелами.Вы можете изобразить эту цепочку команд как вывод каждой строки,
find
вставив ее в конецchmod
команды.Если команда, которую вы хотите запустить в качестве аргумента в середине, а не в конце, вы должны быть немного креативными. Например, мне нужно было перейти в каждый подкаталог и запустить команду
latemk -c
. Поэтому я использовал (из Википедии ):Это имеет эффект
for dir $(subdirs); do stuff; done
, но безопасно для каталогов с пробелами в их именах. Кроме того, отдельные вызовыstuff
выполняются в одной и той же оболочке, поэтому в моей команде мы должны вернуться в текущий каталог с помощьюpopd
.источник
минимальный цикл bash, из которого вы можете построить (основанный на ответе ghostdog74)
сжать целую кучу файлов по каталогу
источник
directory
, а не только подкаталоги.find . -type d -maxdepth 1
источник
Если вы хотите выполнить несколько команд в цикле for, вы можете сохранить результат
find
с помощьюmapfile
(bash> = 4) в качестве переменной и просмотреть массив с помощью${dirlist[@]}
. Он также работает с каталогами, содержащими пробелы.Команда
find
основана на ответе Болдевина. Дополнительную информацию оfind
команде можно найти там.источник