Я пытаюсь получить список каталогов, которые содержатся в определенной папке.
Учитывая эти примеры папок:
foo/bar/test
foo/bar/test/css
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
Я хотел бы команду, которая вернет:
XYZ
ABC
DEF
GHI
По сути, я ищу папки, которые находятся внутри wp-content / plugins /
Использование find
сделало меня ближе всего, но я не могу использовать -maxdepth
, потому что папка находится далеко от того места, где я ищу.
Выполнение следующего возвращает все дочерние каталоги рекурсивно.
find -type d -path *wp-content/plugins/*
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
?
. Для bash (как отмечено в вопросе) это работает .find
реализации, которые выводят?
или любой замещающий символ, или любую форму экранирования для непечатаемых символов, делают это только тогда, когда вывод идет в терминал, а не когда он идет в канал, как здесь.sed
/awk
все файлы в строке. Теперь можно утверждать, что получениеABC?BCD
илиABC\nBCD
для интерактивного / терминального вывода было бы более полезным, чем получение двухABC
иBCD
строк для вызываемого каталога$'ABC\nBCD
. Это на уровне представления пользователя, мы могли бы также указать, что для файла, который называется$'AB\bC'
, когда вывод идет на терминал, вы увидитеAC
без такой?
замены ...Bash-чески:
печатает:
или
печатает:
источник
Вы могли бы иметь
find
рекурсию, вроде:источник
Для Bash: Simple (работает с файлами / директориями с пробелами и символами новой строки ):
Будет печать:
Даже если есть файлы, созданные.
источник
dotglob
Опцию, если это нежелательно) и включает символические ссылки на каталоги в дополнение к каталогам (**
также будет проходить символические ссылки в bash 4.2 и более ранних версиях).find
не исключает ни одного файла. globs исключает точечные файлы, стоит отметить разницу между ними.Команда
tree
предназначена именно для этой цели. Глубину можно контролировать с помощью-L
флага. Вот пример на местном сайте Wordpress, который я поддерживаю:источник
Основываясь на ответе DopeGhoti, как насчет цикла соответствия:
Причина, по которой вы можете сделать это таким образом, заключается в том, что вы можете посчитать, что это может привести к путанице / громоздкости с несколькими
-exec
символами, в то же время избегая проблем с особыми именами файлов, содержащими \ n '' и т. Д. -Print0 будет использовать нулевые разделители между результатами.источник
Основываясь на том, что вы начали:
egrep захватывает * wp-content / plugins / * и любые символы до следующей косой черты / или конца строки $ - включая нужную часть.
sed с разделителем ~ выбирает нужную часть, используя первый набор скобок (), и использует \ 1 (то, что вы хотите) в качестве замены всего
Uniq отфильтровывает повторяющиеся результаты
источник