LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3918|回复: 9

防止误删文件的脚本

[复制链接]
发表于 2003-5-16 16:05:41 | 显示全部楼层 |阅读模式
有的时候由于操作不当而误删某些文件,可以把下列的脚本del,用别名的方式放在/etc/profile中,即:
alias rm='/xxx/xxx/del'
这样的话,每次删文件的时候,给些必要的警告,从而达到防止误删的目的.
  1. #!/bin/ksh
  2. #scriptname:del
  3. #用BASH的修改print.
  4. file=$(echo $*)
  5. count=1
  6. print "The File(s) Type:\n$(file $file)"
  7. #提示你要删除的文件类型.
  8. while (($count<4)) do
  9. print -n "\a";read ask?"Warning:Are you really delete:$file?"
  10. ((count+=1))
  11. if [[ $ask = n ]]
  12.   then
  13.     exit
  14. fi
  15. done
  16. #给你三次警告,如果你反悔,就按n,退出!
  17. print -n "\a";read input?"file:$file Will be deleted!,last
  18. chance![y]"
  19. #最后一次警告,后悔还来得及!否则...
  20. case $input in
  21. y) for i in $* ;do rm $i; done ;;
  22. *) exit ;;
  23. esac
复制代码
发表于 2003-5-16 17:15:09 | 显示全部楼层

回复: 防止误删文件的脚本

最初由 javalee 发表
有的时候由于操作不当而误删某些文件,可以把下列的脚本del,用别名的方式放在/etc/profile中,即:
alias rm='/xxx/xxx/del'
这样的话,每次删文件的时候,给些必要的警告,从而达到防止误删的目的.

  1. #!/bin/ksh
  2. #scriptname:del
  3. #用BASH的修改print.
  4. file=$(echo $*)
  5. count=1
  6. print "The File(s) Type:\n$(file $file)"
  7. while (($count<4)) do
  8. print -n "\a";read ask?"Warning:Are you really delete:$file?"
  9. ((count+=1))
  10. done
  11. print -n "\a";read input?"file:$file Will be deleted!,last chance![y]"
  12. case $input in
  13. y) for i in $* ;do rm $i; done ;;
  14. *) exit ;;
  15. esac
复制代码


用的是ksh?
我的机器都没有装这个呢,也从来没有用过,所以也没有看懂
不过从你的文字描述看来 `rm -i` 似乎也能达到这个功能
 楼主| 发表于 2003-5-16 17:20:00 | 显示全部楼层
对,其实就是多了几次警告而已~~没什么特别之处;)
用bash的将print改成echo就可以啦~~
发表于 2003-5-16 18:36:51 | 显示全部楼层

用来练练手,挺好的.

最初由 javalee 发表
对,其实就是多了几次警告而已~~没什么特别之处;)
用bash的将print改成echo就可以啦~~
 楼主| 发表于 2003-5-16 21:47:01 | 显示全部楼层
其实由于shell支持通配符扩展,才容易产生rm *的恶果,;),可以用set -o noglob来禁止在文件名中使用*?之类的操作.
发表于 2003-5-17 09:27:43 | 显示全部楼层
老大,删除文件要回答三次,我肯定会疯的;)
我觉得,应该这样设计:执行脚本后将文件移到一个特定目录下,并记录文件原始位置,退出系统之前再将目录清空,这样直至退出系统之前都有机会恢复。
 楼主| 发表于 2003-5-17 11:04:55 | 显示全部楼层
疯也比你后悔好呀;)
你说的办法我也这么想过,我再弄弄,反正非典时期没的干,;)
发表于 2003-5-17 12:10:29 | 显示全部楼层
最初由 LYOO 发表
老大,删除文件要回答三次,我肯定会疯的;)
我觉得,应该这样设计:执行脚本后将文件移到一个特定目录下,并记录文件原始位置,退出系统之前再将目录清空,这样直至退出系统之前都有机会恢复。


看看这个:
#=======================begin=======================
#!/bin/bash
#myrm
#move the file(s) to the /trash/~ instead of deleting and record some neccessary information.
USER=`whoami`
TRASH=/trash/$USER
RECORD=/trash/$USER/record #record file
ORIG=`pwd`
DATE=`date +%T---%Y/%m/%d`

Usage ()
{
        echo "Usage: `basename $0` file(s)"
}

if [ "$1" = "-h" -o "$1" = "-?" -o "$1" = "--help" ];then
        Usage
        exit 0
fi
if [ $# -le 0 ];then
        Usage
        exit 1
fi

if [ ! -d $TRASH ];then
        mkdir -p $TRASH
fi

for i in $@
        do
                if [ ! -f $i ];then
                echo "$i does't exist!"
                continue
                fi
               
                if [ -w $i ];then
                        mv $i $TRASH
                        if [ $? -ne 0 ];then
                        echo "Something wrong occurred while delete file $i"
                        #but now i won't exit,because there may be other files to be deleted!
                        else
                        #now write the record file
                        if [ "`dirname $i`" = "." ] #relative path
                        then
                                echo -e "$PWD/`basename $i`\t\t$DATE ">>$RECORD
                        else
                                echo -e "$i \t\t$DATE">>$RECORD
                        fi
                        fi
                else
                echo "You have not enough permission to delete $i!"
                fi
        done
exit 0
#=====================end===========================

删除的时候是移动到/trash/$USER/目录下,同时用record文件记录原文件路径,以及删除时间。

最好还写一个recover脚本,根据record文件来恢复。
 楼主| 发表于 2003-5-17 13:22:20 | 显示全部楼层
VERY GOOD ;)
继续努力兄弟,做完了别忘了放在[脚本欣赏]里,也是给广大LinuxSir们做出的贡献嘛~~
发表于 2003-5-17 13:37:31 | 显示全部楼层
这也要兄弟们帮忙测试才行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表