我想這樣做:慶典:在find命令複雜的測試
find . -type f -exec test $(file --brief --mime-type '{}') == 'text/html' \; -print
,但我想不出引用或逃逸的參數傳遞給測試,尤其是在正確的道路「$(」 ...')'。
我想這樣做:慶典:在find命令複雜的測試
find . -type f -exec test $(file --brief --mime-type '{}') == 'text/html' \; -print
,但我想不出引用或逃逸的參數傳遞給測試,尤其是在正確的道路「$(」 ...')'。
你不能簡單地將它們傳遞給find
。
任何外殼擴展將會發生之前find
運行。 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'
如果你真的想把它全部放在一行上,而不使用單獨的腳本,你可以直接從find
調用sh
:
find . -type f -exec sh -c 'test $(file --brief --mime-type "$0") == "text/html"' {} \; -print
雖然有可能把它變成一個瘋狂援引言論的話,它往往更容易 - 也更加清晰 - 是一個小更詳細:
$ find . -type f -print0 | xargs -0 file --mime-type | ↷
grep ':[^:]*text/html$'| sed 's,:[^:]*text/html,,'
使用「{}」,而不是爲一個簡單列舉文件類型的例子:
find * -maxdepth 0 -exec file "{}" \;
我很害怕這會是答案!我試圖避免爲測試創建一個單獨的命令腳本。這似乎也起作用:'發現。 -type f -exec文件--mime-type'{}'\; | grep'text/html'| cut -d':'-f1',但我希望能有更通用的解決方案來解決這種模式。 – 2010-09-20 19:16:52
您也可以使用bash的-c選項,而不是在單獨的文件中編寫代碼:find。 -type'f -exec bash -c'test $(file --brief --mime-type「$ 1」)==「text/html」'''{} \; -print – 2010-09-20 19:21:19
@Bart是的,你可以通過直接調用'bash'或者'sh'把它全部內聯;我認爲使用單獨的文件會更清楚,但是你是對的,如果你真的想把它全部放在一行上,你可以做到這一點。 – 2010-09-20 19:40:03