在递归目录的大列表中,我正在搜索不包含模式以模式结尾的文件的目录名" mt"
在这种情况下如何搜索目录名称。
我搜索net并找到命令,找到包含f:
文件的目录名find . -type f -name '*f*' | sed -r 's|/[^/]+$||' | sort | uniq
但是如何搜索目录名称w / o mt
找到命令,但没有找到正确的参数
我能够在递归目录中搜索文件名,但在这里我有兴趣在递归模式中搜索不包含带有mt模式的文件的目录名
答案 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
。