Bash中如何用find对目标文件同时执行两个命令
问题
需要在Bash中递归对特定文件执行两个命令,要求先输出文件名,再输出对应文件的元数据,依次处理每个文件。
原本的两个独立命令分别是:
- 打印文件名:
find . -wholename '*word/test.wsp' -exec echo {} \; - 打印元数据:
find . -wholename '*word/test.wsp' -exec whisper-info {} \;
但第二个命令不输出文件名,无法对应元数据所属文件。尝试过多种命令组合均失败,包括:
find . -wholename '*word/test.wsp' -exec echo {} && whisper-info {} \;find . -wholename '*word/test.wsp' -exec echo && whisper-info {} \;find . -wholename '*word/test.wsp' -exec echo {} && -exec whisper-info {} \;find . -wholename '*word/test.wsp' -exec echo {} \; && whisper-info {} \;find . -wholename '*word/test.wsp' -exec echo {} \; && -exec whisper-info {} \;
解决办法
方法1:用Shell包裹多命令(推荐)
通过find的-exec调用子Shell,将两个命令绑定为一组,确保针对同一个文件执行:
find . -wholename '*word/test.wsp' -exec sh -c 'echo "$1"; whisper-info "$1"' sh {} \;
说明:
sh -c '...'启动子Shell执行引号内的命令序列"$1"代表find传递的当前文件名(即{}),双引号包裹可避免文件名含空格时出错- 末尾的
sh是给子Shell的$0赋值,避免脚本出现异常行为
方法2:多次使用-exec参数
如果不想用子Shell,也可以连续调用两次-exec,find会对每个匹配文件依次执行两个命令:
find . -wholename '*word/test.wsp' -exec echo {} \; -exec whisper-info {} \;
之前组合失败的原因
你尝试的命令错误在于:
&&会被当前Shell解析为find命令执行完成后再执行后续命令,而非-exec的一部分,导致whisper-info无法获取当前文件路径- 多次
-exec的写法不符合语法,正确格式是每个-exec独立,无需用&&连接
内容的提问来源于stack exchange,提问作者Aaron Hoffman
相关产品推荐
相关产品推荐

