Shell-Script
命令 find 不適用於 sh 文件中的 -name 選項
我正在使用以下命令來檢索名稱包含的文件數
sv
或json
遠端伺服器中給定目錄中的文件數: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。