我想做点什么:
find . -type f -exec test $(file --brief --mime-type '{}' ) == 'text/html' \; -print
但我无法弄清楚引用或逃避测试的args的正确方法,尤其是'$('...')'。
答案 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 "{}" \;