Find
使用儲存在變數中的 -newerct 值時查找錯誤
我正在嘗試創建一個 bash 函式,該函式將使用一個簡單的文件,例如
sample.txt
start=22 Mar 2016 10:00 end=22 Mar 2016 12:09
…並在 start 和 end 指定的時間範圍內找到我已安裝到 /usr/local 的文件。
我最初創建的功能是:
function findInstalled () { if [[ $# -ne 1 ]]; then echo "[ERROR] Usage: findInstalled /path/to/file" ; return 1; fi start=$( grep start $1 | cut -d'=' -f2 ) ; end=$( grep end $1 | cut -d'=' -f2 ) ; if [[ ! -z $start ]]; then start="-newerct \"${start}\"" ; fi if [[ ! -z $end ]]; then end="! -newerct \"${end}\"" ; fi echo find /usr/local $start $end -type f ; find /usr/local $start $end -type f ; }
..並執行該函式給出以下輸出:
$ findInstalled /path/to/sample.txt find /usr/local -newerct "22 Mar 2016 10:00" ! -newerct "22 Mar 2016 12:09" -type f find: I cannot figure out how to interpret `"22' as a date or time
該命令的實際執行給出了錯誤
...cannot figure out how to interpret...
。但是,如果我複制並粘貼命令的回顯版本,它會成功執行。 知道問題是什麼嗎? 請注意,我已經嘗試過 - 和不 - 雙 qoutes 和單 qoutes 的各種不同組合,但它們都沒有奏效。通過執行以下操作,我已經使該功能正常工作,儘管不是完全按照我想要的方式:
function findInstalled () { if [[ $# -ne 1 ]]; then echo "[ERROR] Usage: findInstalled /path/to/file" return 1; fi start=$( grep start $1 | cut -d'=' -f2 ) ; end=$( grep end $1 | cut -d'=' -f2 ) ; find /usr/local -newerct "$start" ! -newerct "$end" -type f ; }
所以,使用這個,我已經成功地實現了我最初的目標,但我很想知道為什麼我的原始功能不起作用,或者是否有可能。
問題是外殼如何將行分解為標記。它擴展
$start
為-newerct "22 Mar 2016 10:00"
,然後在空格上拆分單詞。因此find
傳遞了以下參數:-newerct
、"22
、Mar
等,因此是錯誤消息。man bash
狀態:擴展的順序是:大括號擴展、波浪號擴展、參數、變數和算術擴展以及命令替換(以從左到右的方式完成)、分詞和路徑名擴展。
我不確定它是否可以按照您想要的方式完成。您的第二個腳本更具可讀性,但您必須確保變數不為空。也許你可以這樣做:
find /usr/local ${start:+-newerct} "$start" ${end:+! -newerct} "$end" -type f ;