Find

使用儲存在變數中的 -newerct 值時查找錯誤

  • March 23, 2016

我正在嘗試創建一個 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"22Mar等,因此是錯誤消息。man bash狀態:

擴展的順序是:大括號擴展、波浪號擴展、參數、變數和算術擴展以及命令替換(以從左到右的方式完成)、分詞和路徑名擴展。

我不確定它是否可以按照您想要的方式完成。您的第二個腳本更具可讀性,但您必須確保變數不為空。也許你可以這樣做:

find /usr/local ${start:+-newerct} "$start" ${end:+! -newerct} "$end" -type f ;

引用自:https://unix.stackexchange.com/questions/271557