我正在尝试获取特定文件夹中包含的目录列表。
给定这些示例文件夹:
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
, bash
,yash
尽管通常在某些选项下),(/)
仅选择类型的文件目录,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