[script-share][bash][脚本评定]自动清理回收站“过期”文件

sh/bash/dash/ksh/zsh等Shell脚本
x312844584
帖子: 58
注册时间: 2009-10-23 23:46

[script-share][bash][脚本评定]自动清理回收站“过期”文件

#1

帖子 x312844584 » 2010-09-23 11:03

:em11 更新 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 -e
启动守候任务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

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------重要的修正线

:em05 经过一班“论战“最后发觉,此脚本的功能,可用下段命令替代。精华就是如此提取出来的~~辛苦的回报原来如此

代码: 全选

find  ~/.local/share/Trash/files/ -maxdepth 1 -a -ctime +30 | xargs rm -rf 
没有经过全面考虑,“顺脑”想到的。所以不知道会不会有什么以外发生。请指正
不要-maxdepth 1后,就会递归进入下层文件夹查找。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------重要的修正线
:em01 因为上面的code没有考虑到文件名包含空格以及排除查找路径本身,因此修正如下

代码: 全选

find /home/$USER/.local/share/Trash/files -depth ! -path '/home/$USER/.local/share/Trash/files' -a -ctime +30 -delete
自行更改$USER为明确的用户名


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以前分割线
:em11 大家能否指出这段脚本中什么不完善的地方,或者你觉得需要改进的地方。我的本意是想将这个脚本放到crontab里面运行的,才浅。想继多人的智慧使这个shell更加完善点,特此来搬救兵。
大家可以随意使用并转发这段code

[Preset]
这段bash可以自动除回收站中的过期文件或者文件夹:
初始设定为
  • 过期天数(自删除文件那天起的天数)=30天
  • 回收站文件夹位置=$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
上次由 x312844584 在 2012-12-01 22:09,总共编辑 5 次。
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#2

帖子 trigger » 2010-09-23 11:55

挺好的。我觉得或许不必循环。
合并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全删除
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
x312844584
帖子: 58
注册时间: 2009-10-23 23:46

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#3

帖子 x312844584 » 2010-09-23 13:25

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全删除
:em11 rev 果然好用。这样处理方便了许多,原来我还不知有这个命令。这样可以很好的将删除日期与文件没整合在一起,不用分次处理。date -d '-1 month'也不错。
但我这样从>./info文件夹中获取文件名,是因为要考虑到重名文件你可以将两个重名文件,移动到回收站,在 >ls 一次
就知道linux如何在Trash下面可以存在“同名“文件了。

但我想应该还是要用循环的吧。因为最后起码还要一行一行比较 时间,才能交给 >rm -rf 处理。还是请赐教一下
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#4

帖子 trigger » 2010-09-23 13:54

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全删除
:em11 rev 果然好用。这样处理方便了许多,原来我还不知有这个命令。这样可以很好的将删除日期与文件没整合在一起,不用分次处理。date -d '-1 month'也不错。
但我这样从>./info文件夹中获取文件名,是因为要考虑到重名文件你可以将两个重名文件,移动到回收站,在 >ls 一次
就知道linux如何在Trash下面可以存在“同名“文件了。

但我想应该还是要用循环的吧。因为最后起码还要一行一行比较 时间,才能交给 >rm -rf 处理。还是请赐教一下
哦,没考虑到重名 :em06
可以把date -d '-1 month' +%Y-%m-%d获得的时间直接放到
Splus.594456E6E6F916353EDE5DCF30CBDB3784D149CF.1 DeletionDate=2010-09-20T14:12:41
ubit DeletionDate=2010-09-17T08:45:24
里面,sort一下,看你顺序还是逆序,决定删除之上的还是之下的 :em04
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#5

帖子 trigger » 2010-09-23 13:56

大、小、闰月的事情我也没测试,不知道在10月31日,3月30日……取得上个月当天是什么结果
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
x312844584
帖子: 58
注册时间: 2009-10-23 23:46

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#6

帖子 x312844584 » 2010-09-23 14:15

trigger 写了:...
哦,没考虑到重名 :em06
可以把date -d '-1 month' +%Y-%m-%d获得的时间直接放到
Splus.594456E6E6F916353EDE5DCF30CBDB3784D149CF.1 DeletionDate=2010-09-20T14:12:41
ubit DeletionDate=2010-09-17T08:45:24
里面,sort一下,看你顺序还是逆序,决定删除之上的还是之下的 :em04
——————————————————————————————
大、小、闰月的事情我也没测试,不知道在10月31日,3月30日……取得上个月当天是什么结果
是是是,我就考虑到比较了。原来是将获得的 一个月前的时间加进原来的文本里面。受教了。
时间问题可以 date -d '-30 day' 这样求得天数,等我几时无聊的时候,按这个思想重写下。

想问下,如果比较时间。是否有不用化为 时间戳 的方法?
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#7

帖子 trigger » 2010-09-23 14:39

单纯比较日期的话,去掉分隔符比就行了。你是这意思吗?
date +%Y%m%d
20100923
据说GNU的date可以直接做减法,不知道怎么做
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
头像
Jarson
帖子: 2371
注册时间: 2008-07-21 9:44
来自: 深圳
联系:

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#8

帖子 Jarson » 2010-09-23 17:05

mark :em11
x312844584
帖子: 58
注册时间: 2009-10-23 23:46

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#9

帖子 x312844584 » 2010-09-23 19:23

trigger 写了:单纯比较日期的话,去掉分隔符比就行了。你是这意思吗?
...
当然不是啦,我的意思怎么才能直接比较相差大于30天的时间,比如2010-08-22 比 2010-09-30大于 30天 返回布尔值;
而不是像我上面的code一样用 先将时间转化为 时间戳 再比较。
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#10

帖子 astolia » 2010-09-23 23:32

代码: 全选

#! /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
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#11

帖子 trigger » 2010-09-24 9:07

x312844584 写了:
trigger 写了:单纯比较日期的话,去掉分隔符比就行了。你是这意思吗?
...
当然不是啦,我的意思怎么才能直接比较相差大于30天的时间,比如2010-08-22 比 2010-09-30大于 30天 返回布尔值;
而不是像我上面的code一样用 先将时间转化为 时间戳 再比较。
一年之内%j相减取天数。跨年365-上一年%j+今年%j
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#12

帖子 eexpress » 2010-09-24 11:36

find不一句就可以了。
带日期检测的啊。
● 鸣学
x312844584
帖子: 58
注册时间: 2009-10-23 23:46

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#13

帖子 x312844584 » 2010-09-24 12:02

回复: astolia
astolia 写了:

代码: 全选

#! /bin/bash -

# 过期天数
DEADLINE=30

TRASHDIR=~/.local/share/Trash

for infofile in "$TRASHDIR"/info/*.trashinfo; do
...
done
:em11 杰作阿,小小几行,大大用处!!!awk 字符处理真是强大,简便!!! :em02 ,根据你的蓝本,重写了脚本。

主要是考虑到"$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*的文件
上次由 x312844584 在 2010-10-01 8:35,总共编辑 1 次。
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#14

帖子 astolia » 2010-09-24 12:29

awk程序脚本有点小问题。如果文件名中也包含“DeletionDate=”这些字符,就会执行出错。
需要稍微修改一下对FS的赋值。改成

代码: 全选

FS="^DeletionDate="
就可以了
x312844584
帖子: 58
注册时间: 2009-10-23 23:46

Re: [script-share][bash][脚本评定]自动清理回收站“过期”文件

#15

帖子 x312844584 » 2010-09-24 12:47

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] 可以验证。
所用的脚本只要通过上面那条命令就可以简化
回复