2010-09-20 34 views

回答

9

你不能簡單地將它們傳遞給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 
+0

我很害怕這會是答案!我試圖避免爲測試創建一個單獨的命令腳本。這似乎也起作用:'發現。 -type f -exec文件--mime-type'{}'\; | grep'text/html'| cut -d':'-f1',但我希望能有更通用的解決方案來解決這種模式。 – 2010-09-20 19:16:52

+0

您也可以使用bash的-c選項,而不是在單獨的文件中編寫代碼:find。 -type'f -exec bash -c'test $(file --brief --mime-type「$ 1」)==「text/html」'''{} \; -print – 2010-09-20 19:21:19

+0

@Bart是的,你可以通過直接調用'bash'或者'sh'把它全部內聯;我認爲使用單獨的文件會更清楚,但是你是對的,如果你真的想把它全部放在一行上,你可以做到這一點。 – 2010-09-20 19:40:03

1

雖然有可能把它變成一個瘋狂援引言論的話,它往往更容易 - 也更加清晰 - 是一個小更詳細:

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

使用「{}」,而不是爲一個簡單列舉文件類型的例子:

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