Shell-Script

命令 find 不適用於 sh 文件中的 -name 選項

  • July 6, 2020

我正在使用以下命令來檢索名稱包含的文件數svjson遠端伺服器中給定目錄中的文件數:

nbs_files=`ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f -name '*sv*' -o -name '*.json' -exec basename {} \; | wc -l"` 

此命令僅返回文件的數量.json,而sv名稱中的文件存在於${path}.

當我刪除該-o -name '*.json'部分時,該命令執行良好,並返回名稱中包含“sv”的文件數。

有誰知道如何修改命令以檢索包含sv在其名稱中的文件以及帶有副檔名的文件.json

問題是和/或表達式中的運算符優先級find-o具體來說,相鄰測試之間的隱式 AND 比兩個名稱測試之間的 OR ( ) 具有更高的優先級。所以測試表達式被解析為:

   -maxdepth 1 -mindepth 1 -type f -name '*sv*'
OR
   -name '*.json' -exec basename {} \;

…並且由於-name '*.json'是唯一與 相同分支的一部分-exec,因此-exec僅針對 json 文件執行。

解決方案是用測試周圍的顯式括號覆蓋正常優先級-name

nbs_files=$(ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f '(' -name '*sv*' -o -name '*.json' ')' -exec basename {} \; | wc -l")

順便說一句,我還冒昧地將反引號替換為$( )- 它們是更現代的選擇,更易於閱讀,並且沒有反引號所具有的奇怪的轉義異常。請參閱此問題BashFAQ #82

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