我有一个巨大的文件夹,其中有很多子文件夹,我想在其中搜索包含三个单词的文件夹。请注意,文件夹名称需要包含全部三个单词,但单词的顺序并不重要。
示例:我想查找包含单词APE
、Banana
和 的文件夹Tree
。
find folder -name '*APE*Banana*Tree*'
但是,此命令将考虑单词的顺序,虽然这并不有趣,但我想以任何顺序查找包含这些单词的任何文件夹。
答案1
只需使用 3-name
秒:
find folder -name '*APE*' -name '*Banana*' -name '*Tree*' -type d
请注意,就像在模式中使用通配符一样-name
,它可能会丢失名称中包含在用户区域设置中不形成有效字符的字符序列的文件。
和zsh
:
set -o extendedglob # best in ~/.zshrc
print -rC1 -- **/(*Banana*~^*APE*~^*Tree*)(ND/)
这/
全局限定符相当于find
选择目录-type d
类型的文件d
。
和ksh93
:
FIGNORE='@(.|..)'
set -o globstar
set -- ~(N)**/@(*Banana*&*APE*&*Tree*)/
(($# == 0)) || printf '%s\n' "$@"
ksh93
没有 glob 限定符,但将 a 附加/
到 glob 会限制对目录文件或目录符号链接的扩展。
和bash
:
shopt -s globstar dotglob nullglob extglob
set -- **/!(!(*Banana*)|!(*APE*)|!(*Tree*))/
(($# == 0)) || printf '%s\n' "$@"
ksh93
与上面关于尾随的注释相同/
。
在哪里:
D
,FIGNORE
,dotglob
确保隐藏文件也被报告(就像find
那样)N
,~(N)
,nullglob
使 glob 扩展为空,而不是导致错误或在没有匹配项时扩展为自身globstar
使ksh93
/bash
理解 zsh 的**/
递归通配运算符。(x~^Y)
,@(X&Y)
,!(!(X)|!(Y))
存在各自 shell 中的三种方法来匹配与两种模式匹配的文件。