在unix上模拟像删除一样的窗口

时间:2012-07-13 19:01:27

标签: linux bash unix

所以基本上我试图在bash shell中创建一个脚本,它将模拟windows删除功能。

因此,它不会删除文件或文件夹,而是将其移动到回收站。我将所有工作都与我将文件夹移动到回收站中的问题分开了。

例如,如果我有一个空文件夹并运行我的脚本safe_rm,它将不会将文件夹移动到bin。但是,如果我在该父文件夹中有一个子文件夹,它将删除父文件夹和子文件夹,所以

safe_rm -r dir1 /< - 不会删除

safe_rm dir1 /,内容为dir2 file1(dir1 / file1 dir1 / dir2)将删除。

这是我的代码我遇到了

的问题
moveFilesFolder(){
 #check if file/directory exists
    if [ $(checkFileFolder $1) == "true" ]
    then
      movingFilesToRemove=$(ls $1)
      #if there's too many files/directories then send them to the moveFiles functions
      if [ ${#movingFilesToRemove[*]} -gt 1 ]
      then
        movingFiles $movingFilesToRemove
      else
      #folder handling  
        if [ $(isFolder $1) == "true" ]
        then
          #we check the rR flag for selected folder  
          if [ $optionRFlag == "false" ]
          then
            echo "rm: cannot remove \`$1': Is a directory"
         else
           lvlDown=true
           #we check if the I argument used on the folder,
               #which prompts the user
           if [ $optionIFlag == "true" ] && [ $(isFolderEmpty $1) == "false" ]
            then
              read -p "rm: descend into directory \`$1'?" downFolder
              case $downFolder in
              y* | Y*)
                lvlDown="true" ;;
              *)
                lvlDown="false" ;;
              esac

            fi
            if [ $lvlDown == "true" ]
            then
              #now we display all the descending folders and gives full path
              #i will be using the sed command to handle sub files 
              #this will proceed every item with present working folde
          subfiles=$(ls $1 | sed "s;^;`pwd`/$1;")
           # subfiles=$(ls $1 | grep '^d' )
           # subfiles=$(ls -R | grep ":" | sed "s/://" )  

           movingFiles $subfiles
            #now we move the empty folder 
              if [ $(isFolderEmpty $1) == "false" ]  
              then
                dlt=true
    if [ $optionIFlag == "true" ] 
    then
                 read -p "rm: remove directory \`$1'?" deleteFolder
                 case $deleteFolder in
                 y* | Y*)
                    dlt="true" ;;
                 *)
                    dlt="false" ;;
                 esac
               fi

               if [ $dlt == "true" ]
               then
                 mv $1 $recycleFolder
                echo `pwd` 
                 if [ $optionVFlag == "true" ]
                 then
                   echo "removed directory: \`$1'"
                 fi
               fi
             fi
           fi
         fi
       else
         #here we are dealing with file handling 
         agreed=true
         if [ $optionIFlag == "true" ]
         then
           read -p "$(interMessage $1)" userAccepts
           case $userAccepts in
           y* | Y*)
             agreed="true" ;;
           *)
             agreed="false" ;;
           esac
         fi
         #refer to above i flag
         if [ $agreed == "true" ]
         then

           mv $1 $recycleFolder
           echo `pwd`
           if [ $optionVFlag == "true" ]
           then
             echo "removed \`$1'"
           fi
         fi
       fi
     fi
   else

     echo "rm: cannot remove \`$1': No such file or directory"
   fi

}

2 个答案:

答案 0 :(得分:4)

请参阅comp.unix.questions faq,问题3.6:“我如何”取消删除“文件?”

http://www.faqs.org/faqs/unix-faq/faq/part3/

  

两点:首先,这是普遍接受的         作为的想法。您将依赖于此行为         “rm”,你会发现自己有一天会在一个正常的系统上         “rm”真的是“rm”,你会遇到麻烦。         其次,你最终会发现处理的麻烦         它维护垃圾桶所涉及的磁盘空间和时间         对于“rm”来说可能更容易一点。对于         首先,你应该在你的“rm”中查找“-i”选项         手册。

答案中提到的MIT删除/取消删除实用程序套件可以在

找到

http://ftp.funet.fi/pub/archive/comp.sources.misc/volume17/delete/

答案 1 :(得分:1)

垃圾生活的地方

大多数Linux系统上的垃圾都在~/.local/share/Trash/{expunged,files,info}。跟踪元信息涉及一些子目录,但如果您不担心完全符合trashspec,则可以将文件或目录投入~/.local/share/Trash/files

穷人的垃圾

即使您不关心垃圾邮件的完全符合性,您仍然可以使用垃圾设施,同时确保符合其关键要求之一。 trashspec说:

  

即使具有相同名称和位置的文件多次被删除,每次后续删除都不得覆盖以前的副本。

您可以使用基本的shell函数来满足要求。例如:

trash () {
    local trashdir="$HOME/.local/share/Trash/files"
    mkdir -p "$trashdir"
    mv --backup=numbered "$@" "${trashdir}/"
}

使用CLI工具

如果您使用的是基于Debian的系统,则可以安装trash-cli。安装后,您可以直接调用它或将其别名以供透明使用。例如:

sudo aptitude install trash-cli
alias rm='trash'

mkdir /tmp/foobarbaz
touch /tmp/foobarbaz
rm -rf /tmp/foobarbaz

请注意,这似乎并不能很好地处理Ubuntu的ecryptfs安装的主目录,但除此之外,无需重新发明轮子就可以开箱即用。“