如何在目录中查找目录?

如何在目录中查找目录?

如何找到具有特定名称的目录,但前提是它位于另一个具有特定名称的目录中?例如当我有以下目录结构时

a
├── b
│   └── e
├── c
│   └── e
└── d

我想找到目录“e”,但前提是它位于名为“c”的目录中。如果可能的话,单独使用 find 命令而不使用 grep。

答案1

使用 GNUfind-path搜索整个路径以查找匹配项:

$ find . -path '*/c/e'
./a/c/e

e这将匹配名为的目录中的任何文件或目录c

或者,如果您没有 GNUfind或任何其他支持的-path,您可以执行以下操作:

$ find . -type d -name c -exec find {} -name e \;
./a/c/e

这里的技巧是首先找到所有c/目录,然后仅在其中搜索名为e.

答案2

由于您已经标记了 Bash,因此另一种方法是使用环球星:

shopt -s globstar # Sets globstar if not already set
# Print the matching directories
echo **/c/e/
# Or put all matching directories in an array
dirs=(**/c/e/)

答案3

除了 @terdon 的解决方案之外,我在这里为那些没有 GNU find 的人提供了一个替代版本(我只能按照他的想法找到!):

find . -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null 

这似乎适用于我的机器

去测试:

# add files under each directories as otherwise some solutions would 
# list also files under any "c/e" subdirs ... 
# in a subdir : do  : 
mkdir -p a b c a/b a/c a/c/e a/c/d/e a/c/d/e/c/e/f/g
for i in $(find */ -type d -ls); do ( cd "$i" && touch a b c d e ) ; done 
# this will creates several files under each subdirs, wherever it can (ie, when they don't match a subdir's name).
# then test:
find . -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null 
# and it answers only the 2 matching subdirs that match name "c/e":
inode1 0 drwxr-xr-x   1 uid  gid   0 nov.  2 17:57 ./a/c/e
inode2 0 drwxr-xr-x   1 uid  gid   0 nov.  2 18:02 ./a/c/d/e/c/e

答案4

使用 Fd 工具:

fd -t d --full-path /c/e$

https://github.com/sharkdp/fd

相关内容