Shell脚本求助:归档2天前同名目录执行tar命令报错
问题解决
错误原因
你用单引号包裹find /apps/logs/* -mtime +2,单引号会将内容视为纯字符串,不会执行find命令。循环变量x的值因此变成整个命令字符串find /apps/logs/* -mtime +2,传给tar时,tar会把这些单词当作选项/参数解析,导致冲突报错。
修正后的脚本
方法1:使用命令替换(推荐写法)
for x in $(find /apps/logs -type d -mtime +2); do echo "Tarring $x.." tar cvzf "${x}.tar.gz" "$x" done
关键修改点
- 将单引号替换为
$()(也可用反引号`,但$()可读性更强),让Shell执行find命令并返回结果作为循环列表 - 添加
-type d确保只处理目录,避免误操作文件 - 给变量套双引号
"$x"和"${x}.tar.gz",防止目录名含空格时出现解析错误
方法2:用find的-exec直接处理(更安全)
如果担心目录名包含特殊字符,推荐用find的-exec选项,彻底避免循环变量的解析问题:
find /apps/logs -type d -mtime +2 -exec tar cvzf "{}.tar.gz" "{}" \;
这里{}代表find找到的每个目录,\;标记-exec命令的结束。
额外说明
-mtime +2表示修改时间超过48小时(24*2)的目录,符合你的需求- 若只想处理
/apps/logs下的一级目录(不递归子目录),可添加-maxdepth 1参数:
find /apps/logs -maxdepth 1 -type d -mtime +2 -exec tar cvzf "{}.tar.gz" "{}" \;
内容的提问来源于stack exchange,提问作者Arpan
相关产品推荐
相关产品推荐

