rai*_*man 4 shell find shell-script basename
我正在使用以下命令来检索名称包含的文件数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"`
Run Code Online (Sandbox Code Playgroud)
此命令仅返回.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 {} \;
Run Code Online (Sandbox Code Playgroud)
...并且由于-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")
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我还冒昧地将反引号替换为$( )- 它们是更现代的选择,更易于阅读,并且没有反引号所具有的那种奇怪的转义异常。请参阅此问题和BashFAQ #82。
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |