我正在使用以下命令来检索名称包含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
表达式中的和/或运算符优先级。具体而言,相邻测试之间的隐式AND优先级高于-o
两个名称测试之间的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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句