作者:mobiledu2502875393 | 来源:互联网 | 2023-08-24 11:49
我有个文件下面,他的文件命名是有规则的
如:abc2008-03-01-1.out
abc2008-03-01-2.out
……
……
abc2008-03-02-1.out
abc2008-03-02-2.out
……
……
我先在想定期压缩当前日期前十天以前的所有.out 结尾的文件
改如何实现?
谢谢了。
35 个解决方案
我自己先开个头吧
#!/bin/bash
currdate='date ''+%F''' /*显示当前日期的命令*/
$currdate /*显示当前日期*/
filenames=out${curdate}* /*将OUT与当前日期的值连接起来*/
/*压缩文件列表*/
……
……
……
……
#/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
我有个文件下面,他的文件命名是有规则的
如: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
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’来获取更多信
怎么解决啊?
我把程序改成如下:
#/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
但我不知道怎么比较文件的日期?
namedate=`echo $name ¦cut -c cut -c 4-7,9-10,12-13`
改成
namedate=`echo $name ¦ cut -c 4-7,9-10,12-13`
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
到底是哪里出错啊?
expr $workdate \> = $namedate
请问这是什么意思?
先把文件找到,然后执行操作
#!/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
每10天一次就crontab -e
添加:
0 0 1,10,20,28 * * /home/10.sh
每月的1,10,20,28号的00:00执行/home/10.sh这个脚本,有的文件可能会被重复压缩,直接覆盖就可以了
现在我把程序修改成下面:
#/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语句是不上有点问题啊?
不同的系统可能有些出入
if [ $namedate -a "expr `$workdate \> = $namedate ` -eq 1" ] 换成
if [ ! -z $namedate -a `expr $workdate \>= $namedate ` -eq 1 ]
对了我用的Red Hat Enterprise Linux
用
if [ ! -z $namedate -a `expr $workdate \> = $namedate ` -eq 1 ]
报参数多了
用
if [ $namedate -a "expr `$workdate \> = $namedate ` -eq 1" ]
把所有的文件都压缩了,条件有问题
! -z -a -eq 1 这些前后都要有空格的
你检查一下,
你可以单独测试条件,看那个出错了。
if [ ! -z $namedate ]
then
if [ `expr $workdate \> = $namedate ` -eq 1 ]
then
gzip ...
fi
fi
shell怎样做赋值操作啊?
比如我想用datediff=`${workdate} - ${namedate}`
echo $datediff
可老报错
a=b
b就赋值给a了。
B shell 不支持
a-b这样格式的直接加减
一般是这样
datediff=`expr ${workdate} - ${namedate}`
a=b
b就赋值给a了。
B shell 不支持
a-b这样格式的直接加减
一般是这样
datediff=`expr ${workdate} - ${namedate}`
如果用:
datediff=`echo ${workdate} - ${namedate}`
echo $datediff
直接显示
20080303 - 20080311
20080303 - 20080310
就是不显示其运算的结果,郁闷啊
a=b
这样就直接赋值了
b shell不支持a-b这样格式的直接加减
datediff=`expr ${workdate} - ${namedate} `
如果用
datediff=` echo ${workdate} - ${namedate}`
echo $datediff
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果
如果用
datediff=` echo ${workdate} - ${namedate}`
echo $datediff
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果
如果用
datediff=` echo ${workdate} - ${namedate}`
echo $datediff
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果
如果用
datediff=` echo ${workdate} - ${namedate}`
echo $datediff
显示
20080303-20080201
20080303-20080301
20080303-20080211
就是不显示运算结果
不好意思,再次麻烦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} 运算出来的结果是一个串,而不是我想要的整数
这个有办法吗?
哈哈,搞定了
#/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}"`
的“-”前后忘了加制表符
最后的程序修改成:
#/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 等的大力支持,真的谢谢大家了。