-3

基本的に、Windowsの削除機能をエミュレートするスクリプトをbashシェルで作成しようとしています。

そのため、ファイルまたはフォルダーを削除する代わりに、ごみ箱に移動します。フォルダーをごみ箱に移動する際に発生している問題を除けば、すべてが機能しています。

たとえば、空のフォルダーがあり、スクリプト safe_rm を実行すると、フォルダーはビンに移動しません。ただし、その親フォルダーに子フォルダーがある場合、親と子の両方が削除されるため、

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

}
4

2 に答える 2

4

comp.unix.questions FAQ の質問 3.6 を参照してください: 「ファイルを「元に戻す」にはどうすればよいですか?

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

2 つのポイント: まず、これは一般的に悪い考えとして受け入れられています。あなたはこの「rm」の振る舞いに依存するようになり、いつか「rm」が実際には「rm」である通常のシステムに身を置くことになり、トラブルに巻き込まれることになります。第二に、最終的には、ごみ箱を維持するために必要なディスク容量と時間を処理する手間がかかることに気付くでしょう。「rm」にもう少し注意を払うだけで簡単になるかもしれません。手始めに、マニュアルで「rm」の「-i」オプションを調べてください。

回答に記載されている MIT 削除/削除取り消しユーティリティ スイートは、次の場所にあります。

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

于 2012-07-13T19:13:55.937 に答える
1

ゴミが住んでいる場所

ほとんどのLinuxシステムのゴミ箱はに住んでい~/.local/share/Trash/{expunged,files,info}ます。メタ情報の追跡に関係するいくつかのサブディレクトリがありますが、完全なtrashspec準拠~/.local/share/Trash/filesについて心配しない場合は、ファイルまたはディレクトリをトスすることができます。

貧乏人のゴミ

trashspecに完全に準拠していなくても、主要な要件の1つに準拠していることを確認しながら、ごみ処理機能を利用できます。trashspecは言う:

同じ名前と場所のファイルが何度もゴミ箱に移動された場合でも、その後のゴミ箱に移動するたびに前のコピーが上書きされてはなりません。

基本的なシェル関数で要件に準拠できます。例えば:

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にマウントされたホームディレクトリをうまく処理していないように見えることに注意してください。それ以外の場合は、車輪の再発明をしなくても、箱から出してすぐにtrashspecに準拠できます。

于 2012-07-14T02:03:05.170 に答える