查找比匹配目录深一层的目录列表

查找比匹配目录深一层的目录列表

我正在尝试获取特定文件夹中包含的目录列表。

给定这些示例文件夹:

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

答案1

只需添加一个-prune,以便找到的目录不会下降到:

find . -type d -path '*/wp-content/plugins/*' -prune -print

您需要引用它,*wp-content/plugins/*因为它也是一个 shell glob。

如果您只需要目录名称而不是其完整路径,则find可以使用 GNU 替换-print-printf '%f\n'假设文件路径不包含换行符,将上述命令的输出通过管道传输到awk -F / '{print $NF}'sed 's|.*/||'(还假设文件路径包含仅有效字符)。

zsh

printf '%s\n' **/wp-content/plugins/*(D/:t)

**/是任何级别的子目录(起源于zsh早期 Nighties 的功能,现在在大多数其他 shell 中找到,例如ksh93, tcsh, fish, bashyash尽管通常在某些选项下),(/)仅选择类型的文件目录D包括隐藏的(点),:t以获得尾巴(文件名)。

答案2

你可以有find递归,有点像:

find / -type d -path *wp-content/plugins -exec find {} -maxdepth 1 -mindepth 1 -type d \;

答案3

bash 地:

shopt -s globstar
printf "%s\n" **/wp-content/plugins/*

印刷:

bat/bar/foo/blog/wp-content/plugins/GHI
baz/wp-content/plugins/ABC
baz/wp-content/plugins/DEF
foo/bar/wp-content/plugins/XYZ

或者

shopt -s globstar
for d in **/wp-content/plugins/*; do printf "%s\n" ${d##*/}; done

印刷:

GHI
ABC
DEF
XYZ

答案4

tree命令正是为此目的而设计的。深度可以通过-L标志来控制。以下是我维护的本地 WordPress 站点上的示例:

$ tree -L 1 wp-content/
wp-content/
├── index.php
├── plugins
└── themes

2 directories, 1 file

$ tree -L 2 wp-content/
wp-content/
├── index.php
├── plugins
│   ├── akismet
│   ├── contact-form-7
│   ├── index.php
│   └── wordpress-seo
└── themes
    ├── index.php
    ├── twentyfifteen
    └── twentysixteen

11 directories, 3 files

$ tree -L 1 wp-content/plugins/
wp-content/plugins/
├── akismet
├── contact-form-7
├── index.php
└── wordpress-seo

5 directories, 1 file

相关内容