在linux 下操作时经常需要用到
rm -rf
,一招不慎轻者从删库到跑路,重者跑路机会都没有。趁放假,试着结合实际生产环境,实现一下之前一直想的win回收站机制
alias
给rm
取别名,用脚本my_rm.sh
代替rm
执行my_rm.sh
调用rm
实现 命令rm
的基本功能,如:rm -rf
等。同时,将要删除的文件放入定义好的回收站。(实际使用mv
来实现rm
的删除加放入文件夹功能)此脚本实现了
rm
命令进行文件以及文件夹的删除动作,同时模拟支持了-r
,-f
等参数du
命令计算所删除内容占用等总空间大小,可通过设置upper_limit
来设定当文件大于多少时直接删除,不放入回收站#!/bin/bash
###############################################
# Filename : my_rm.sh
# Author : PedroQin
# Email : pedroqin@gmail.com
# Date : 2019-10-06 14:58:56
# Description :
# Version : 1.0.0
###############################################
trash_dir_main="/tmp/trash"
trash_dir="$trash_dir_main"/`date +%Y%m%d`
[ ! -d ${trash_dir} ] && mkdir -p ${trash_dir}
upper_limit="$[5000*1024]" ## unit : K
#### for this script env vaiable
RECURSIVE=0
FORCE=0
PROMPT_ONCE=0 # exclusive with FORCE var
PROMPT=0 # exclusive with FORCE var
###
rm_cmd="rm -i"
mv_cmd="mv -i"
###
function confirm ()
{
local ans=""
local -i ret=0
while [ -z "$ans" ]; do
read -p "$1" ans
boolean $ans
ret=$?
[ $ret -eq 255 ] && ans=""
done
#echo "$ans"
return $ret
}
function boolean()
{
case "$1" in
[tT] | [yY] | [yY][eE][sS] | [tT][rR][uU][eE] | L6 | L10 | L12 )
return 0
;;
[fF] | [nN] | [nN][oO] | [fF][aA][lL][sS][eE])
return 1
;;
esac
return 255
}
rm_index=0
while [ ! -z "$1" ];do
case "$1" in
-r|--recursive)
RECURSIVE=1
;;
-f|--force)
FORCE=1
;;
-fr|-rf)
RECURSIVE=1
FORCE=1
;;
-i)
PROMPT=1
;;
-I)
PROMPT_ONCE=1
;;
*)
let rm_index++
dir_file[$rm_index]="$1"
;;
esac
shift
done
err_code=0
suffix=`date "+%H%M%S"`
#echo $rm_index
for i in `seq 1 $rm_index`
do
dir_file_name=${dir_file[$i]}
#echo $dir_file_name
if [ ! -d "${dir_file_name}" ]&&[ ! -f "${dir_file_name}" ];then
echo "[${dir_file_name}] do not exist"
let err_code++
continue
else
file_name=`basename "${dir_file_name}"`
# check
if [ -d "$dir_file_name" -a ${RECURSIVE:-0} -eq 0 ] ;then
echo cannot remove \'"${dir_file_name}"\' Is a directory
let err_code++
continue
fi
echo -n "summary size... "
file_size=`du -sk "${dir_file_name}"|awk '{print $1}'`
echo "$file_size k"
# for large file/dir
if [ "$file_size" -ge "$upper_limit" ];then
if confirm "The file/dir size is $file_size > $upper_limit(upper_limit) ,delet it without mv to Trash?[Y|N]: " ;then
rm_para=""
[ "${RECURSIVE:-0}" -eq 1 ] && rm_para="$rm_para -r"
[ "${FORCE:-0}" -eq 1 ] && rm_para="$rm_para -f"
eval $rm_cmd "$rm_para" "${dir_file_name}" || let err_code++
continue
else
continue
fi
fi
if [ "${FORCE:-0}" -eq 0 ];then
if ! confirm "rm '"${dir_file_name}"'?[Y|N]: " ;then
continue
fi
fi
target_path=${trash_dir}/"${file_name}"_${suffix}_${RANDOM}
eval $mv_cmd "${dir_file_name}" ${target_path}
echo "[${dir_file_name}] delete completed, Trash path: ${target_path}"
fi
done
exit $err_code
此脚本实现了
#!/bin/bash
###############################################
# Filename : clear_trash.sh
# Author : PedroQin
# Email : pedroqin@gmail.com
# Date : 2019-10-06 18:43:18
# Description :
# Version : 1.0.0
###############################################
trashdir=/tmp/trash
cd ${trashdir}
# files/dirs which modified 3 days ago ,delet
find ./ -mtime +3 -print0 |xargs -0 rm -rf {} \;
vim ~/.bashrc
,修改rm
别名alias rm="bash /root/my_rm.sh" # 修改文件路径
vim /etc/crontab
最下一行为添加当任务,此种方法仅用于root用户,所有用户都可以通过crontab -e
命令添加,内容同此处方法略有不同,例:00 20 * * * bash /root/clean_trash.sh
,相比修改/etc/crontab
少了user-name
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
00 20 * * * root bash /root/clean_trash.sh
systemctl restart crond.service
https://github.com/pedroqin/shell_script/tree/master/linux_recycle_bin
本文分享自 WriteSimpleDemo 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!