Grep 搜索不包含模式为的文件的目录名

Grep 搜索不包含模式为的文件的目录名,grep,find,Grep,Find,在递归目录的大列表中,我正在搜索不包含以模式“mt”结尾的文件的目录名 在这种情况下,如何搜索目录名 我搜索网络并找到命令,以查找包含带有f的文件的目录名: find . -type f -name '*f*' | sed -r 's|/[^/]+$||' | sort | uniq 但是如何搜索没有mt的目录名呢 find命令,但未找到正确的参数 我可以在递归目录中搜索文件名,但我感兴趣的是在递归模式中搜索目录名,该模式不包含包含mt模式的文件。您可以使用: find . -type f -

在递归目录的大列表中,我正在搜索不包含以模式“mt”结尾的文件的目录名

在这种情况下,如何搜索目录名

我搜索网络并找到命令,以查找包含带有f的文件的目录名:

find . -type f -name '*f*' | sed -r 's|/[^/]+$||' | sort | uniq
但是如何搜索没有mt的目录名呢

find命令,但未找到正确的参数

我可以在递归目录中搜索文件名,但我感兴趣的是在递归模式中搜索目录名,该模式不包含包含mt模式的文件。您可以使用:

find . -type f -name '*f*' | grep -v  'mt$'
grep-v
过滤掉与下面模式的每个匹配项。

目录树 创建黑名单 查找目录
此解决方案忽略直接包含
*mt
文件的所有目录。

编写脚本(使用
fgrep
)来忽略那些间接包含
*mt
文件的(
/b
)是很容易的。

类似的方法应该可以工作

find -type d -exec bash -c \
'
shopt -s nullglob dotglob; 
found=; 
for f in "{}"/*mt; do 
  [[ -f $f ]] && found=true && break; 
done; 
[[ $found == true ]] || echo "{}";
' \; 
如果您希望目录包含
*mt

这可能是一种更简单的方法,但是如果不使用
eval
(使用它会导致安全问题),您就不能延迟
-exec
中的glob扩展,因此想不出更好的方法将其放入
bash-c

∮ find . -name '*mt' | sed 's@/[^/]*mt$@@; s@^@^@' > blacklist

∮ cat blacklist
^./b/y
^./a
∮ find . -type d | grep -v -f blacklist
.
./b
./b/x
./b/z
./c
find -type d -exec bash -c \
'
shopt -s nullglob dotglob; 
found=; 
for f in "{}"/*mt; do 
  [[ -f $f ]] && found=true && break; 
done; 
[[ $found == true ]] || echo "{}";
' \;