如何捕获带-exec参数的find命令输出?执行时无输出但文件已压缩
解决find -exec压缩无输出的问题
我之前也遇到过类似的情况——用find配合-exec执行压缩时,终端一片寂静,但文件确实在被处理,这种“黑箱”操作很让人不安对吧?下面给你几种实用的方法来捕获输出:
1. 让压缩工具输出详细信息
大多数压缩工具(比如gzip、zip)都有**verbose(详细模式)**参数,开启后会输出压缩的进度、文件名、压缩率等信息:
- 对于
gzip,用-v参数:find /your/target/path -type f -name "*.log" -exec gzip -v {} \; - 对于
zip,用-v参数(注意zip的用法和gzip不同):find /your/target/path -type f -name "*.txt" -exec zip -v archive.zip {} \;
开启verbose后,压缩工具会直接把输出打印到终端,你就能实时看到哪些文件正在被处理了。
2. 用sh -c包裹命令捕获全量输出(包括错误)
如果压缩过程中出现错误(比如权限不足、文件损坏),默认这些错误信息会输出到stderr,可能不会被你注意到。用sh -c包裹命令,同时把stderr重定向到stdout,就能统一捕获所有输出:
find /your/target/path -type f -name "*.csv" -exec sh -c 'gzip -v "$1" 2>&1' sh {} \;
这里的2>&1表示把标准错误(文件描述符2)重定向到标准输出(文件描述符1),这样不管是正常的压缩日志还是错误信息,都会显示在终端上。
3. 把输出记录到日志文件
如果需要保留压缩过程的记录,可以把输出写入日志文件:
# 仅写入日志,不实时显示 find /your/target/path -type f -name "*.log" -exec sh -c 'gzip -v "$1" >> compress_log.txt 2>&1' sh {} \; # 实时显示同时写入日志 find /your/target/path -type f -name "*.log" -exec sh -c 'gzip -v "$1" 2>&1 | tee -a compress_log.txt' sh {} \;
tee -a会把输出同时写到终端和日志文件,-a表示追加模式,避免覆盖之前的日志。
4. 批量处理时的输出捕获
如果用find ... -exec ... +(批量传递文件给压缩命令,效率更高),需要调整sh -c的写法,用循环处理每个文件:
find /your/target/path -type f -name "*.txt" -exec sh -c ' for file do echo "正在压缩: $file" gzip -v "$file" done ' sh {} +
这里我们还额外加了echo来明确输出当前正在处理的文件,进一步增强可读性。
5. 让find本身输出找到的文件
如果你只是想确认find找到了哪些文件,可以加上-print参数,这样find会先打印文件名,再执行压缩:
find /your/target/path -type f -name "*.log" -print -exec gzip {} \;
这种方法适合不需要压缩详细信息,只需要确认find搜索结果的场景。
为什么默认没有输出?
简单说:
- 像
gzip这类工具,默认成功时是静默的(避免冗余输出),只有出错才会输出错误信息到stderr; find的-exec只是负责调用子命令,不会主动捕获或转发子命令的输出,所以如果压缩工具没输出,终端就看不到任何内容。
内容的提问来源于stack exchange,提问作者capser
相关产品推荐
相关产品推荐

