热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我想在unix下实现一个定期自动压缩文件的shell,请高手指点一下

我有个文件下面,他的文件命名是有规则的如:abc2008-03-01-1.outabc2008-03-01-2.out…………abc2008-03-
我有个文件下面,他的文件命名是有规则的
如:abc2008-03-01-1.out
    abc2008-03-01-2.out
    ……
     ……
   abc2008-03-02-1.out
    abc2008-03-02-2.out
    ……
     ……

我先在想定期压缩当前日期前十天以前的所有.out 结尾的文件
改如何实现?

谢谢了。

35 个解决方案

#1


我自己先开个头吧
#!/bin/bash
currdate='date ''+%F'''   /*显示当前日期的命令*/
$currdate                 /*显示当前日期*/
filenames=out${curdate}*   /*将OUT与当前日期的值连接起来*/
/*压缩文件列表*/
……
……
……
……

#2


??????

#3


#/bin/sh
ls *.out|while read name
do
echo $name
namedate=`echo $name|cut -c cut -c 4-7,9-10,12-13`
workdate=`date "-d -10 day" +%Y%m%d`
if [ $namedate -a  "`expr $workdate \>= $namedate ` -eq 1"  ]
then
tar -rf back$namedate.tar $name
fi
done

#4


我有个文件下面,他的文件命名是有规则的 
如:abc2008-03-01-1.out 
    abc2008-03-01-2.out 
    …… 
     …… 
   abc2008-03-02-1.out 
    abc2008-03-02-2.out 
    …… 
     …… 

我先在想定期压缩当前日期前十天以前的所有.out 结尾的文件 
改如何实现? 

谢谢了。
--------------
find  DIR  -mtime +10 -name "abs*out" |xargs compress 

#5


引用 4 楼 ouygg 的回复:
我有个文件下面,他的文件命名是有规则的
如:abc2008-03-01-1.out
abc2008-03-01-2.out
……
……
abc2008-03-02-1.out
abc2008-03-02-2.out
……
……

我先在想定期压缩当前日期前十天以前的所有.out 结尾的文件
改如何实现?

谢谢了。
--------------
find  DIR  -mtime +10 -name "abs*out"  ¦xargs compress

find 
-mtime n
              File’s data was last modified n*24 hours ago.  //是文件的最后修改时间,不是按文件名所记录的时间

#6


命令写好就放到crond不就ok了

#7


谢谢各位了,调试成功回头结贴

#8


compress.sh 的内容如下:
#/bin/sh 
ls *.out |while read name 
do 
echo $name 
namedate=`echo $name |cut -c cut -c 4-7,9-10,12-13` 
workdate=`date "-d -10 day" +%Y%m%d` 
if [ $namedate -a  "`expr $workdate \> = $namedate ` -eq 1"  ] 
then 
#tar -rf back$namedate.tar $name 
gzip -9 $name
fi 
done 

执行后好像还有点问题:提示如下:
./compress.sh
out2008-03-10.out
cut: invalid byte, character or field list
请尝试执行‘cut --help’来获取更多信息。
out2008-03-11.out
cut: invalid byte, character or field list
请尝试执行‘cut --help’来获取更多信

怎么解决啊?

#9


我把程序改成如下:
#/bin/sh 
ls *.out |while read name 
do 
echo $name 
namedate=`echo $name|cut -c 4-13`
echo ${namedate}*.out
done 

执行结果如下:

./compress1.sh
out2008-03-10.out
2008-03-10*.out
out2008-03-11.out
2008-03-11*.out

但我不知道怎么比较文件的日期?

#10


namedate=`echo $name  ¦cut -c cut -c 4-7,9-10,12-13`
改成
namedate=`echo $name  ¦ cut -c 4-7,9-10,12-13`

#11


hzcpig:你好!
谢谢你的帮忙,我按你的修改了,程序执行没有报错,但文件也没有压缩
我的程序如下:
#/bin/sh 
ls *.out |while read name 
do 
echo $name 
namedate=`echo $name |cut -c 4-7,9-10,12-13`
workdate=`date "-d -10 day" +%Y%m%d` 
if [ $namedate -a  "`expr $workdate \> = $namedate ` -eq 1"  ] 
then 
gzip -9 $name 
fi 
done 

如果我把gzip -9 $name 屏蔽换成显示文件名,
#/bin/sh 
ls *.out |while read name 
do 
echo $name 
namedate=`echo $name |cut -c 4-7,9-10,12-13`
workdate=`date "-d -10 day" +%Y%m%d` 
if [ $namedate -a  "`expr $workdate \> = $namedate ` -eq 1"  ] 
then 
#gzip -9 $name 
echo $name
fi 
done 
则会报错如下:
out2008-03-10.out
expr: syntax error
out2008-03-10.out
out2008-03-11.out
expr: syntax error
out2008-03-11.out

到底是哪里出错啊?

#12


好像是报EXPR的语法错误哦?

#13


expr $workdate \>  = $namedate
请问这是什么意思?

#14


先把文件找到,然后执行操作
#!/bin/sh

#下面的path是指定的路径
echo "shuru jueduilujing:"
read path 
filename = `find $path -ctime  +10   -name     "abs*out"  `
for i in $filename;do
gzip -9 $i
done
   

#15


引用 13 楼 qq345270199 的回复:
expr $workdate \>   = $namedate
请问这是什么意思?


expr是计算表达式的值,意思是如果$workdate 大于等于 $namedate,则expr返回1,否则返回0,
因为>号在shell是关键字符,所以要用\把它转义。

#16


每10天一次就crontab -e
添加:
0   0   1,10,20,28   *   *   /home/10.sh
每月的1,10,20,28号的00:00执行/home/10.sh这个脚本,有的文件可能会被重复压缩,直接覆盖就可以了

#17


引用 14 楼 qq345270199 的回复:
先把文件找到,然后执行操作
#!/bin/sh

#下面的path是指定的路径
echo "shuru jueduilujing:"
read path
filename = `find $path -ctime  +10   -name     "abs*out"  `
for i in $filename;do
gzip -9 $i
done



find 
-ctime n
             -ctime n
              File’s status was last changed n*24 hours ago. //是文件状态的最后修改时间,不是按文件名所记录的时间 

和4楼的情况基本一样。

#18


现在我把程序修改成下面:
#/bin/sh 
ls *.out |while read name 
do 
echo $name 
namedate=`echo $name |cut -c 4-7,9-10,12-13`
workdate=`date "-d -10 day" +%Y%m%d` 
#echo $workdate
if [ $namedate -a  "expr `$workdate \>= $namedate ` -eq 1"  ] 
then 
gzip -9 $name 
#echo $name
fi 
done

压也压缩了,问题是他把out2008-03-11.out也压缩了,这个IF语句是不上有点问题啊?

#19


不同的系统可能有些出入
if [ $namedate -a  "expr `$workdate \> = $namedate ` -eq 1"  ] 换成

if [ ! -z $namedate -a  `expr $workdate \>= $namedate ` -eq 1  ]


#20


对了我用的Red Hat Enterprise Linux

#21



if [ ! -z $namedate -a  `expr $workdate \> = $namedate ` -eq 1  ] 
报参数多了

if [ $namedate -a  "expr `$workdate \>  = $namedate ` -eq 1"  ]
把所有的文件都压缩了,条件有问题

#22


! -z -a  -eq 1 这些前后都要有空格的
你检查一下,

你可以单独测试条件,看那个出错了。
if [ ! -z $namedate ]
then
if [  `expr $workdate \>  = $namedate ` -eq 1  ]  
then 
gzip ...
fi
fi

#23


-ctime 的确是文件create时时间

#24


shell怎样做赋值操作啊?
比如我想用datediff=`${workdate} - ${namedate}`
echo $datediff
可老报错

#25


a=b
b就赋值给a了。

B shell 不支持
a-b这样格式的直接加减

一般是这样

datediff=`expr ${workdate} - ${namedate}`

#26


a=b
b就赋值给a了。

B shell 不支持
a-b这样格式的直接加减

一般是这样

datediff=`expr ${workdate} - ${namedate}`

#27


如果用:
datediff=`echo ${workdate} - ${namedate}` 
echo $datediff 

直接显示
20080303 - 20080311
20080303 - 20080310

就是不显示其运算的结果,郁闷啊

#28


a=b
这样就直接赋值了
b shell不支持a-b这样格式的直接加减
datediff=`expr ${workdate} - ${namedate} `

#29


如果用
datediff=` echo ${workdate} - ${namedate}` 
echo $datediff 
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果

#30


如果用
datediff=` echo ${workdate} - ${namedate}` 
echo $datediff 
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果

#31


如果用
datediff=` echo ${workdate} - ${namedate}` 
echo $datediff 
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果

#32


如果用
datediff=` echo ${workdate} - ${namedate}` 
echo $datediff 
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果 

#33


不好意思,再次麻烦cceczjxy了
我现在的程序如下:
#/bin/sh
ls *.out |while read name
do
echo $name
namedate=`echo $name |cut -c 4-7,9-10,12-13`
workdate=`date "-d -10 day" +%Y%m%d`
datediff=`expr ${workdate}-${namedate}`
echo $datediff
done
执行的结果如下:
out2008-02-10.out
20080304-20080210
out2008-02-11.out
20080304-20080211
out2008-03-11.out
20080304-20080311

也就是说expr ${workdate}-${namedate} 运算出来的结果是一个串,而不是我想要的整数
这个有办法吗?

#34


哈哈,搞定了

#/bin/sh 
ls *.out |while read name 
do 
echo $name 
namedate=`echo $name |cut -c 4-7,9-10,12-13`
workdate=`date "-d -10 day" +%Y%m%d` 
datediff=`expr "${workdate}" - "${namedate}"`
echo $datediff
#if [ $namedate -a  "`expr $workdate \> = $namedate ` -eq 1"  ] 
#if [ "$workdate" \> = $namedate ` -eq 1  ] 
#if ["$workdate" -gt "$namedate" ]
#then 
#gzip -9 $name 
#fi 
done


原来datediff=`expr "${workdate}" - "${namedate}"`
的“-”前后忘了加制表符

#35


最后的程序修改成:
#/bin/sh 
ls *.out |while read name 
do 
echo $name 
namedate=`echo $name |cut -c 4-7,9-10,12-13`
workdate=`date "-d -10 day" +%Y%m%d` 
datediff=`expr "${workdate}" - "${namedate}"`
echo $datediff
#if [ $namedate -a  "`expr $workdate \> = $namedate ` -eq 1"  ] 
#if [ "$workdate" \> = $namedate ` -eq 1  ] 
if [ "$datediff" -gt 0 ]
#if [ "`expr $datediff  \> = 0` -eq 1" ]
then 
gzip -9 $name 
fi 
done

已经达到了我的目的,谢谢cceczjxy、 hzcpig 等的大力支持,真的谢谢大家了。

推荐阅读
  • 之前项目在windows2003服务器上设置定时任务,每天执行。现在把项目移植到linux系统。也要在linux系统上设置计划任务。但是之前我从来没有做过。所以多得不 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
  • 201720181 20155339 《信息安全系统设计基础》第六周学习总结
    2017-2018-120155339《信息安全系统设计基础》第六周学习总结教材学习内容总结控制转移:从ak指令到a(k1)指令的过渡。控制转移序列称为处理器的控制流 ... [详细]
  • linux 循环 cpu使用率脚本,Linux Shell脚本监视CPU利用率,达到设置的CPU利用率时发送电子邮件...
    有很多开源监控工具可用于监控Linux系统性能,当系统达到给定的阈值限制时,它将发送电子邮件警报。它监视CPU利用率、内存利用率、交换利用率、磁盘空间利 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
mobiledu2502875393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有