2012-08-15 22 views
0
find . -type f -exec sh -c ' if [cat ${1} == "abc" ] then echo ${1} fi' _ {} \; 

我得到這個錯誤:有條件殼

_: -c: line 1: syntax error: unexpected end of file 

我在這裏做什麼是:

找到這個目錄中的所有文件,如果文件內容爲abc打印文件名。

謝謝!

+0

可能的重複[爲什麼在'Bash腳本中\'之後和'\]'之後應該有一個空格?](http://stackoverflow.com/questions/9581064/why-should-therebe -a-space-after-a-bash-script) – tripleee 2016-12-28 10:26:05

回答

1

這裏的問題是,[(又名「測試」)的需要用一個空格從cat分離,像這樣:

find . -type f -exec sh -c 'if [ cat ${1} = "abc" ]; then echo ${1}; fi' _ {} \; 

您還在if聲明之後和fi聲明之前缺少分號(看起來您最初在單獨的一行中有這些分號,根據那裏的空格,可能是由於您擁有它的方式nted)

正如在下面的評論中指出的那樣,運行這個會給出錯誤信息too many arguments in if []。在"cat ${1}"附近使用雙引號將避免錯誤消息,但這只是比較"cat ${1}"和​​的擴展。你可能要找的是[ "$(cat ${1})" == "abc" ]。不幸的是,當你將一個非常長的文件與​​進行比較時,這可能會導致問題。

您可以使用grep進行測試,或者取得文件的校驗和(例如shasum),並根據您測試的原因對​​的校驗和進行測試。

+0

也,它說太多的論據在if [] – 2012-08-15 23:05:09

+0

好吧我想通了。需要「」 – 2012-08-15 23:11:13

+0

'[foo == bar]'是無效的POSIX,但是是一個bash擴展。如果你想與基準POSIX shell兼容,使用'[foo = bar]'。 – 2012-08-15 23:44:20

1

在'['和''之前]放置空格和';'後「]」

另一種方式是使用

[ `cat ${1}` == "abc" ] && echo ${1} 
+0

我試過你的&&方式。它說[:太多的論據。 ... – 2012-08-15 23:01:47

+0

其實如果你想比較貓的結果你需要使用反引號(我編輯答案反映) – Teudimundo 2012-08-15 23:40:14

+0

謝謝@ Teudinundo。我想出了另一種方法是「$()」,哈哈不像你的那麼優雅。 – 2012-08-15 23:43:26