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