如何仅将find命令的非空输出写入文件,无输出时不创建文件?
实现find命令非空输出才保存到文件的几种方法
这问题挺实用的,毕竟没人想留一堆空文件占地方对吧?我给你整理了几个靠谱的方案,按需选择就行:
方法一:用Shell变量+条件判断(无额外依赖)
先把find的结果存到变量里,判断变量非空时再写入文件,完全依赖Shell本身,兼容性拉满:
# 替换成你的find命令 search_result=$(find /your/target/path -type f -name "*.txt") # 判断结果是否非空,是就写入文件 if [ -n "$search_result" ]; then echo "$search_result" > output.txt fi
注意:如果你的find结果包含换行符,echo会正常保留;要是担心特殊字符,也可以用printf "%s" "$search_result"替代echo。
方法二:用sponge工具(简洁高效)
如果你能安装第三方工具,sponge绝对是最省心的选择——它会先把所有输入读进内存,确认有内容才写入目标文件,空输入直接跳过不创建文件:
# 先安装moreutils包(包含sponge) # Debian/Ubuntu: sudo apt install moreutils # CentOS/RHEL: sudo yum install moreutils # 直接管道给sponge就行 find /your/target/path -type f -name "*.txt" | sponge output.txt
方法三:临时文件中转(兼容所有场景)
要是不想装工具,也不想用变量(比如结果特别大怕占内存),可以用临时文件中转:
# 先把find结果写到临时文件 find /your/target/path -type f -name "*.txt" > temp_output.tmp # 检查临时文件是否非空(-s选项判断文件大小大于0) if [ -s temp_output.tmp ]; then # 非空就移到目标文件 mv temp_output.tmp output.txt else # 空的话直接删除临时文件 rm temp_output.tmp fi
内容的提问来源于stack exchange,提问作者Josef Klimuk




