请求构建归档主目录中超过30天文件的Shell管道并排查错误命令问题
排查Shell归档命令错误及修正方案
咱们先拆解下你这条命令里的问题,再一步步给出正确的实现方式:
原命令的错误点
你的命令是:
find $HOME | -type f -mtime +30 | tar -rvf myarchive.tar
这里有两个核心错误:
- 参数位置错误:
-type f和-mtime +30是find命令的筛选条件,必须直接跟在find $HOME后面,不能用管道|拆分。管道的作用是把前一个命令的输出传给后一个命令的输入,你这样写相当于让系统执行一个叫-type的命令,这显然不存在,会直接报“command not found”错误。 - tar命令用法错误:就算你修正了
find的参数,直接用管道把文件名传给tar -rvf也不行。tar默认会把命令行参数当成文件名,不会主动读取标准输入的内容,所以需要明确告诉它从标准输入读取文件名列表。
正确的实现方案
这里提供两种可行的方案,第二种更健壮,能处理带特殊字符的文件名:
基础版(适用于文件名无空格/特殊字符的场景)
find "$HOME" -type f -mtime +30 | tar -rvf myarchive.tar -T -
各部分解释:
find "$HOME" -type f -mtime +30:正确筛选主目录下修改时间超过30天的所有普通文件-T -:告诉tar从标准输入(-代表标准输入)读取要归档的文件名列表-r:如果归档文件已存在,就追加新文件;如果不存在则自动创建-v:显示归档的过程(可选,去掉会静默执行)-f:指定归档文件名为myarchive.tar
健壮版(支持所有特殊文件名,推荐使用)
如果你的文件名里有空格、换行符或其他特殊字符,基础版会出错,这时候用null分隔符来处理:
find "$HOME" -type f -mtime +30 -print0 | tar -rvf myarchive.tar --null -T -
各部分额外解释:
-print0:让find用空字符\0分隔输出的文件名,避免特殊字符导致的拆分错误--null:告诉tar识别空字符作为文件名的分隔符,确保所有文件名都能被正确处理
补充说明
- 如果想覆盖已有的归档文件(而不是追加),把
-r换成-c即可 - 建议给
$HOME加上双引号,避免主目录路径里有空格时出现问题
内容的提问来源于stack exchange,提问作者Maja An
相关产品推荐
相关产品推荐

