find命令结合printf与bzip2时,如何实现打印文件名并完成压缩?
解决方法
方法一:用find -exec组合打印与压缩操作
直接通过find的-exec选项执行两个命令,既打印文件名又完成压缩,还能兼容子目录中的文件:
find . -name "*.sb.*" -exec sh -c 'echo "$(basename "$1")"; bzip2 "$1"' _ {} \;
basename "$1"提取文件的纯文件名(对应原命令里的%f),再用echo输出到终端bzip2 "$1"对找到的完整路径文件执行原地压缩_是sh -c脚本的占位参数,{}代表find匹配到的每个文件路径
方法二:修正管道命令,兼顾打印与压缩
如果偏好管道+xargs的写法,可通过指定替换符实现打印与压缩的组合,同时处理含空格的文件名:
find . -name "*.sb.*" -print0 | xargs -0 -I {} sh -c 'echo "$(basename "{}")"; bzip2 "{}"'
-print0和-0配合,避免文件名含空格时出现错误-I {}定义替换标记,把每个文件路径传入sh -c执行后续操作
原命令不打印文件名的原因
原命令中find的printf "%f\n"输出全部通过管道传给了xargs,所有内容都作为bzip2的输入参数,没有输出到终端,因此看不到文件名打印。
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

