如何修改find命令使文件路径与Version标签内容同行输出?
问题:调整find命令输出格式,让文件路径与Version信息同行显示
我编写了如下find命令,用于搜索/main_folder/kits/目录下深度不超过2、文件名以moon_开头且以.xml结尾、并包含<Version>标签的文件:
find /main_folder/kits/ -maxdepth 2 -name "moon*" -name "*.xml" -exec grep '<Version>' {} \; -exec echo {} \;
当前命令会分别输出<Version>标签内容和文件路径,示例输出如下:
<Version>1.3.12-dev.137</Version> /main_folder/kits/A/moon_aaa.xml <Version>2.1.1-dev.13</Version> /main_folder/kits/B/moon_bbb.xml <Version>1.0.144</Version> /main_folder/kits/C/moon_ccc.xml
我希望将每个文件的路径与对应的Version信息调整为同行输出,示例如下:
/main_folder/kits/A/moon_aaa.xml <Version>1.3.12-dev.137</Version> /main_folder/kits/B/moon_bbb.xml <Version>2.1.1-dev.13</Version> /main_folder/kits/C/moon_ccc.xml <Version>1.0.144</Version>
请问需要在原命令中添加什么内容,才能实现这样的同行输出效果?
解决方案
你需要把原来两个独立的-exec操作合并为一个shell命令,让文件名和grep结果在同一行输出,修改后的命令如下:
find /main_folder/kits/ -maxdepth 2 -name "moon_*.xml" -exec sh -c 'echo "$0 $(grep "<Version>" "$0")"' {} \;
关键修改说明:
- 合并执行逻辑:用
sh -c启动一个shell进程,在同一个进程内处理文件名和grep结果,避免两次独立输出导致的换行 - 精准匹配文件名:把原来的
-name "moon*" -name "*.xml"合并为-name "moon_*.xml",直接匹配moon_开头的xml文件,减少不必要的匹配 - 同行拼接内容:
$0对应find传递的文件路径,先输出路径,再通过$(grep "<Version>" "$0")插入提取到的Version标签内容
如果需要去除Version行前面的空白缩进(比如示例里的前置空格),可以加上sed处理:
find /main_folder/kits/ -maxdepth 2 -name "moon_*.xml" -exec sh -c 'echo "$0 $(grep "<Version>" "$0" | sed "s/^[[:space:]]*//")"' {} \;
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

