find . -type f -exec sh -c ' if [cat ${1} == "abc" ] then echo ${1} fi' _ {} \;
我得到這個錯誤:有條件殼
_: -c: line 1: syntax error: unexpected end of file
我在這裏做什麼是:
找到這個目錄中的所有文件,如果文件內容爲abc打印文件名。
謝謝!
find . -type f -exec sh -c ' if [cat ${1} == "abc" ] then echo ${1} fi' _ {} \;
我得到這個錯誤:有條件殼
_: -c: line 1: syntax error: unexpected end of file
我在這裏做什麼是:
找到這個目錄中的所有文件,如果文件內容爲abc打印文件名。
謝謝!
這裏的問題是,[
(又名「測試」)的需要用一個空格從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
),並根據您測試的原因對的校驗和進行測試。
也,它說太多的論據在if [] – 2012-08-15 23:05:09
好吧我想通了。需要「」 – 2012-08-15 23:11:13
'[foo == bar]'是無效的POSIX,但是是一個bash擴展。如果你想與基準POSIX shell兼容,使用'[foo = bar]'。 – 2012-08-15 23:44:20
在'['和''之前]放置空格和';'後「]」
另一種方式是使用
[ `cat ${1}` == "abc" ] && echo ${1}
我試過你的&&方式。它說[:太多的論據。 ... – 2012-08-15 23:01:47
其實如果你想比較貓的結果你需要使用反引號(我編輯答案反映) – Teudimundo 2012-08-15 23:40:14
謝謝@ Teudinundo。我想出了另一種方法是「$()」,哈哈不像你的那麼優雅。 – 2012-08-15 23:43:26
可能的重複[爲什麼在'Bash腳本中\'之後和'\]'之後應該有一個空格?](http://stackoverflow.com/questions/9581064/why-should-therebe -a-space-after-a-bash-script) – tripleee 2016-12-28 10:26:05