bash:find命令中的复杂测试

时间:2010-09-20 18:59:10

标签: linux bash find

我想做点什么:

find . -type f -exec test $(file --brief --mime-type '{}' ) == 'text/html' \; -print 

但我无法弄清楚引用或逃避测试的args的正确方法,尤其是'$('...')'。

3 个答案:

答案 0 :(得分:9)

您不能简单地转义将它们传递给find的参数。

find运行之前,任何shell扩展都会发生find不会通过shell传递它的参数,所以即使你逃避shell扩展,一切都只会被视为test命令的文字参数,而不是像你期望的那样由shell扩展。

实现所需内容的最佳方法是编写一个简短的shell脚本,它将文件名作为参数,并在其上使用-exec

find . -type f -exec is_html.sh {} \; -print

is_html.sh

#!/bin/sh

test $(file --brief --mime-type "$1") == 'text/html'

如果你真的想要一行,而不使用单独的脚本,你可以直接从sh调用find

find . -type f -exec sh -c 'test $(file --brief --mime-type "$0") == "text/html"' {} \; -print

答案 1 :(得分:1)

虽然有可能把它变成一个引用粗俗的陈述,但通常更容易 - 也更清楚 - 更加冗长:

$ find . -type f -print0 | xargs -0 file --mime-type | ↷
   grep ':[^:]*text/html$'| sed 's,:[^:]*text/html,,'

答案 2 :(得分:0)

使用“{}”代替,例如,这只列出文件类型:

find * -maxdepth 0 -exec file "{}" \;