分页: 1 / 2
[script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 11:03
由 x312844584
更新 2012年12月1号
最近注意了一下自己的Crontab任务,发觉原来以前的东西在Xfce桌面上已经不适用了--不能仅仅通过删除
Trash/files (~/.local/share/Trash/files/)
同时删除
Trash/info (~/.local/share/Trash/info/) 里面的文件了。本打算写一个根据只要
代码: 全选
find ~/.local/share/Trash/info/ -a -ctime +30
得出删除时间列表后,再判断删除
Trash/info 与相对应的
Trash/files文件。
但发觉原来 free desktop 中已经有一个开源的 回收站命令行接口 (see more in
Git trash-cli) ,可以让我们通过命令行进行 文件回收站 操作。其中
代码: 全选
trash-empty [文件删除至现在的天数] :清空回收站
最有用, 可以在后面指定 要清空多岁天以前的文件。
节省时间,就利用这个接口来实现 自动管理清除回收站 的想法吧!
首先安装 trash-cli
ubuntu 用户可以直接
代码: 全选
sudo aptitude install trash-cli
,不过我在LinuxMint上用过好像在ubuntu中的trash-cli缺少 trash-rm 的功能。
或者 可以到
Git trash-cli 下载源码安装,方法如下
代码: 全选
# grab the latest sources
wget https://github.com/andreafrancia/trash-cli/tarball/master
# unpack and install
tar xfz andreafrancia-trash-cli-xxxxxxxx.tar.gz
cd andreafrancia-trash-cli-xxxxxxxx
sudo python setup.py install
最后crontab 设置
终端输入
启动守候任务
Crontab, 按照自己所预订 过期天数 与 运行时间,就可以自动清除回收站中的过期文件了。
Crontab运行时间用法详细见Linux下的定时任务crontab设置,
最后记得把 标准输出与错误输出给屏蔽掉!
代码: 全选
##我的Crontab范例:
# 自动清除删除至现在 15 天的回收站文件
# 每天运行三次: 9:15/12:50/22:50 (包含着一天中可能开启的时间)
# 标准输出与错误输出都屏蔽掉
50 9 * * * auto-empty 15 >/dev/null 2>/dev/null
50 12 * * * auto-empty 15 >/dev/null 2>/dev/null
50 22 * * * auto-empty 15 >/dev/null 2>/dev/null
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------重要的修正线
经过一班“论战“最后发觉,此脚本的功能,可用下段命令替代。精华就是如此提取出来的~~辛苦的回报原来如此
代码: 全选
find ~/.local/share/Trash/files/ -maxdepth 1 -a -ctime +30 | xargs rm -rf
没有经过全面考虑,“顺脑”想到的。所以不知道会不会有什么以外发生。请指正
不要
-maxdepth 1后,就会递归进入下层文件夹查找。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------重要的修正线
因为上面的code没有考虑到文件名包含空格以及排除查找路径本身,因此修正如下
代码: 全选
find /home/$USER/.local/share/Trash/files -depth ! -path '/home/$USER/.local/share/Trash/files' -a -ctime +30 -delete
自行更改$USER为明确的用户名
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以前分割线
大家能否指出这段脚本中什么不完善的地方,或者你觉得需要改进的地方。我的本意是想将这个脚本放到crontab里面运行的,才浅。想继多人的智慧使这个shell更加完善点,特此来搬救兵。
大家可以随意使用并转发这段code
[Preset]
这段bash可以自动除回收站中的
过期文件或者文件夹:
初始设定为
- 回收站文件夹位置=$HOME/.local/share/Trash/files
- 回收站信息文件夹(包含有文件的删除时间戳)=$HOME/.local/share/Trash/info
[main code]
代码: 全选
#!/bin/bash -
# Remove 30-days-ago files in Trash regularly.
# It runs in Contab every three day.
#
# !Be carefull to use this script.
#
# by ekeyme 09-21-2010
# IFS='\ \n\t'
IFS='
'
PATH=/usr/local/bin:/bin:/usr/bin
export PATH
# Time interval defaul: 30days
SET_inter=$((30*24*60*60))
# Timetmp now.
nowt=$(date +%D)
nowt_tmp=$(date -d $nowt +%s)
# Trash directory--Infomation dir. : Files dir.
Tr_infodir="$HOME/.local/share/Trash/info"
Tr_filesdir="$HOME/.local/share/Trash/files"
cd "$Tr_infodir" || exit
FILESNAME=$(ls -a | grep -E -v '^\.$|^\.\.$')
# Set the IFS='\n\t' for keyword 'for', some filename contains space-key.
IFS='
'
for filename in $FILESNAME
do
# Get the files in Trash.
Rfilename=$(sed -e 's/\.trashinfo$//' <<< "$filename")
file="$Tr_filesdir/$Rfilename"
# Get the files Deletion Time.
delfilet=$(date +%D -d $(cat "$filename" |
sed -n '/DeletionDate=/ s/DeletionDate=//p'))
delfilet_tmp=$(date -d $delfilet +%s)
# Comparea and rm file...
interval=$(($nowt_tmp - $delfilet_tmp))
if [[ $interval -ge $SET_inter ]]; then
rm -rf $file
fi
done
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 11:55
由 trigger
挺好的。我觉得或许不必循环。
合并info并操作一下文本
cat *|grep =|rev|cut -f1 -d"/"|rev|sed '$!N;s/\n/\t/'
Splus.594456E6E6F916353EDE5DCF30CBDB3784D149CF.1 DeletionDate=2010-09-20T14:12:41
ubit DeletionDate=2010-09-17T08:45:24
然后sort一下第二列
这样获得上个月今天
date -d '-1 month' +%Y-%m-%d
2010-08-23
再处理一下文本,然后grep。在2010-08-23之下或之上的一次性传给rm -rf全删除
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 13:25
由 x312844584
trigger 写了:挺好的。我觉得或许不必循环。
合并info并操作一下文本
cat *|grep =|rev|cut -f1 -d"/"|rev|sed '$!N;s/\n/\t/'
Splus.594456E6E6F916353EDE5DCF30CBDB3784D149CF.1 DeletionDate=2010-09-20T14:12:41
ubit DeletionDate=2010-09-17T08:45:24
然后sort一下第二列
这样获得上个月今天
date -d '-1 month' +%Y-%m-%d
2010-08-23
再处理一下文本,然后grep。在2010-08-23之下或之上的一次性传给rm -rf全删除
rev 果然好用。这样处理方便了许多,原来我还不知有这个命令。这样可以很好的将删除日期与文件没整合在一起,不用分次处理。
date -d '-1 month'也不错。
但我这样从>./info文件夹中获取文件名,是因为要考虑到
重名文件。
你可以将两个重名文件,移动到回收站,在 >ls 一次
就知道linux如何在Trash下面可以存在“同名“文件了。
但我想应该还是要用循环的吧。因为最后起码还要一行一行比较 时间,才能交给
>rm -rf 处理。还是请赐教一下
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 13:54
由 trigger
x312844584 写了:trigger 写了:挺好的。我觉得或许不必循环。
合并info并操作一下文本
cat *|grep =|rev|cut -f1 -d"/"|rev|sed '$!N;s/\n/\t/'
Splus.594456E6E6F916353EDE5DCF30CBDB3784D149CF.1 DeletionDate=2010-09-20T14:12:41
ubit DeletionDate=2010-09-17T08:45:24
然后sort一下第二列
这样获得上个月今天
date -d '-1 month' +%Y-%m-%d
2010-08-23
再处理一下文本,然后grep。在2010-08-23之下或之上的一次性传给rm -rf全删除
rev 果然好用。这样处理方便了许多,原来我还不知有这个命令。这样可以很好的将删除日期与文件没整合在一起,不用分次处理。
date -d '-1 month'也不错。
但我这样从>./info文件夹中获取文件名,是因为要考虑到
重名文件。
你可以将两个重名文件,移动到回收站,在 >ls 一次
就知道linux如何在Trash下面可以存在“同名“文件了。
但我想应该还是要用循环的吧。因为最后起码还要一行一行比较 时间,才能交给
>rm -rf 处理。还是请赐教一下
哦,没考虑到重名
可以把date -d '-1 month' +%Y-%m-%d获得的时间直接放到
Splus.594456E6E6F916353EDE5DCF30CBDB3784D149CF.1 DeletionDate=2010-09-20T14:12:41
ubit DeletionDate=2010-09-17T08:45:24
里面,sort一下,看你顺序还是逆序,决定删除之上的还是之下的

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 13:56
由 trigger
大、小、闰月的事情我也没测试,不知道在10月31日,3月30日……取得上个月当天是什么结果
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 14:15
由 x312844584
trigger 写了:...
哦,没考虑到重名
可以把date -d '-1 month' +%Y-%m-%d获得的时间直接放到
Splus.594456E6E6F916353EDE5DCF30CBDB3784D149CF.1 DeletionDate=2010-09-20T14:12:41
ubit DeletionDate=2010-09-17T08:45:24
里面,sort一下,看你顺序还是逆序,决定删除之上的还是之下的

——————————————————————————————
大、小、闰月的事情我也没测试,不知道在10月31日,3月30日……取得上个月当天是什么结果
是是是,我就考虑到比较了。原来是将获得的 一个月前的时间加进原来的文本里面。受教了。
时间问题可以
date -d '-30 day' 这样求得天数,等我几时无聊的时候,按这个思想重写下。
想问下,如果比较时间。是否有不用化为 时间戳 的方法?
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 14:39
由 trigger
单纯比较日期的话,去掉分隔符比就行了。你是这意思吗?
date +%Y%m%d
20100923
据说GNU的date可以直接做减法,不知道怎么做
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 17:05
由 Jarson
mark

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 19:23
由 x312844584
trigger 写了:单纯比较日期的话,去掉分隔符比就行了。你是这意思吗?
...
当然不是啦,我的意思怎么才能直接比较相差大于30天的时间,比如
2010-08-22 比 2010-09-30大于 30天 返回布尔值;
而不是像我上面的code一样用 先将时间转化为 时间戳 再比较。
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-23 23:32
由 astolia
代码: 全选
#! /bin/bash -
# 过期天数
DEADLINE=30
TRASHDIR=~/.local/share/Trash
for infofile in "$TRASHDIR"/info/*.trashinfo; do
if [ ! -f "$infofile" ];then
# 没有*.trashinfo文件,退出
exit;
fi
# sec为 当前时间-文件删除时间-过期时间,大于等于0表示已经过期
sec=$(awk 'BEGIN{FS="DeletionDate="}{if($2){print systime()-mktime(gensub("[-:T]"," ","g",$2))-'$DEADLINE'*24*3600}}' "$infofile")
if [ $sec -ge 0 ];then
filename=$(basename "$infofile" | sed 's/.trashinfo$//')
rm -rf "$TRASHDIR/files/$filename"
rm -rf "$infofile"
fi
done
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-24 9:07
由 trigger
x312844584 写了:trigger 写了:单纯比较日期的话,去掉分隔符比就行了。你是这意思吗?
...
当然不是啦,我的意思怎么才能直接比较相差大于30天的时间,比如
2010-08-22 比 2010-09-30大于 30天 返回布尔值;
而不是像我上面的code一样用 先将时间转化为 时间戳 再比较。
一年之内%j相减取天数。跨年365-上一年%j+今年%j
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-24 11:36
由 eexpress
find不一句就可以了。
带日期检测的啊。
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-24 12:02
由 x312844584
回复: astolia
astolia 写了:代码: 全选
#! /bin/bash -
# 过期天数
DEADLINE=30
TRASHDIR=~/.local/share/Trash
for infofile in "$TRASHDIR"/info/*.trashinfo; do
...
done

杰作阿,
小小几行,大大用处!!!awk 字符处理真是强大,简便!!!

,根据你的蓝本,重写了脚本。
主要是考虑到
"$TRASHDIR"/info/*.trashinfo不能显示出
点号文件的问题;
还有就是,这段
代码: 全选
if [ ! -f "$infofile" ];then
# 没有*.trashinfo文件,退出
exit;
如果在
^^/info/ 里面,塞入一个不是普通文件(文件夹),怕它退出不处理后续文件。
重写之后的shell
代码: 全选
#!/bin/bash -
#
# astolia main job
#
# 设置分割符,阻止外界设定的分隔符
IFS='
'
PATH=/usr/local/bin:/bin:/usr/bin
export PATH
# 文件过期时间:30天
EXPDAYS=30
# 回收站路径:信息文件夹 与 文件文件夹
INFODIR=~/.local/share/Trash/info
FILEDIR=~/.local/share/Trash/files
for infofile in $INFODIR/*.trashinfo $INFODIR/.*.trashinfo; do
# 不是普通文件,跳过
[[ ! -f "$infofile" ]] && continue
# sec = 现在系统时间 - 文件删除时间 - 30天
sec=$(awk -v FS='^DeletionDate=' '$2{print systime()-mktime(gensub("[-:T]", " ", "g", $2))-'$EXPDAYS'*24*60*60}' "$infofile")
# sec 大于等于0表示已经过期,删除...
if [[ "$sec" -gt 0 ]]; then
# 回收中过期文件路径
file=$FILEDIR/$(basename "$infofile" | sed -e 's/\.trashinfo$//')
rm -rf "$file"
rm -rf "$infofile"
fi
done
- -->10-1-2010 修改sec=...awk的字段分割符FS,规避文件名为*DeletionDate*的文件
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-24 12:29
由 astolia
awk程序脚本有点小问题。如果文件名中也包含“DeletionDate=”这些字符,就会执行出错。
需要稍微修改一下对FS的赋值。改成
代码: 全选
FS="^DeletionDate="
就可以了
Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件
发表于 : 2010-09-24 12:47
由 x312844584
pocoyo 写了:eexpress 写了:find不一句就可以了。
带日期检测的啊。
求验证 这句行吗?
你find 一次不就行了,懒人!
代码: 全选
find /home/ekeyme/.local/share/Trash/files/ -maxdepth 1 -a -ctime +30 | xargs rm -rf
可以做到,测试了一下时间戳,验证了下OK!,以前不想到就是没去测试,到底是
-atime 还是 -mtime 或者 -ctime
原来 find [path] -ctime 很有牛力吗,
文件的移动时间是记录在 Chage time 里面的。用 stat [file] 可以验证。
所用的脚本只要通过上面那条命令就可以简化