Linux技巧:如何高效比对目录中同名不同后缀的文件
解决.out与同名.expect文件比对的Shell命令方案
你之前的问题出在变量$i包含了.out后缀,导致拼接后变成了xxx.out.expect,自然找不到正确的文件。下面是几种简单可行的解决办法:
方法一:用Bash参数扩展去掉后缀
直接通过参数扩展截掉.out后缀,这是Bash自带的功能,简洁高效:
for i in *.out; do diff "$i" "${i%.out}.expect"; done
解释:${i%.out}会把变量i末尾的.out部分删除,比如test1.out会变成test1,再加上.expect就得到了对应的test1.expect。
方法二:用basename命令提取文件名
如果记不住参数扩展的写法,用basename命令也能实现,它专门用来提取文件名(去掉路径和指定后缀):
for i in *.out; do base=$(basename "$i" .out) diff "$i" "$base.expect" done
解释:basename "$i" .out会返回去掉.out后缀的文件名,比如输入test2.out就返回test2,再拼接.expect即可。
方法三:跳过无对应.expect文件的情况(可选)
如果有些.out文件没有对应的.expect,可以加个判断避免diff报错:
for i in *.out; do base="${i%.out}" if [ -f "$base.expect" ]; then diff "$i" "$base.expect" fi done
这样只有当对应的.expect文件存在时,才会执行diff命令,不会出现"找不到文件"的错误提示。
内容的提问来源于stack exchange,提问作者Rudy
相关产品推荐
相关产品推荐

