搜索不包含带模式的文件的目录名称

时间:2014-08-17 04:46:52

标签: grep find

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

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

我搜索net并找到命令,找到包含f:

文件的目录名
find . -type f -name '*f*' | sed -r 's|/[^/]+$||' | sort | uniq

但是如何搜索目录名称w / o mt

找到命令,但没有找到正确的参数

我能够在递归目录中搜索文件名,但在这里我有兴趣在递归模式中搜索不包含带有mt模式的文件的目录名

3 个答案:

答案 0 :(得分:0)

您可以使用:

find . -type f -name '*f*' | grep -v  'mt$'

grep -v过滤掉后续模式的所有匹配项。

答案 1 :(得分:0)

目录树

∮ tree -F
.
├── a/
│   └── x.mt
├── b/
│   ├── x/
│   ├── y/
│   │   └── x.mt
│   └── z/
├── blacklist
└── 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

此解决方案忽略所有直接包含*mt文件的目录 编写脚本(使用fgrep)来忽略间接包含.文件的那些(./b*mt)很容易。

答案 2 :(得分:0)

这样的事情应该有效

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

这可能是一种更简单的方法,但是如果没有-exec(使用可能会导致安全问题),您无法在eval中推迟全局展开,因此无法思考更好的方法然后将其放入bash -c