Bash
Linux
Ubuntu

bashで「ファイルの削除」を「ファイルの移動」にする

More than 2 years have passed since last update.

ファイルの削除でファイルを本当には削除しないようにする

githubに置いてあります。
※「spitiko」でインストール出来ます。

Linuxなどで「rm」コマンドでファイルやディレクトリを削除すると、取り返しがつきません。
なので、下記のようなbashスクリプトを「/usr/local/bin/trash」みたいなファイルで設置して、

alias rmf="trash"

みたいにして、rmfコマンドを使うと、ホームディレクトリの「.Trash」に移動されるだけで、実際にはファイルは削除されないという形にしてみた。
スクリプトの最後を見ると分かりますが、このスクリプトを使うたびに「.Trash」に移動されてから30日経過したファイルは自動的に削除されます(これはほんとに消えます)。
オプションとして「--clean」を付けて実行すると、強制的に「.Trash」ディレクトリ内を空にします。
あと、Macの場合はOS標準のゴミ箱も「.Trash」なので、ファインダーで捨てたファイル/フォルダーも30日経過すると消えます。
今のバージョンでは、シンボリックリンクは移動出来ないのでそのまま削除されます。
シンボリックリンクは削除されても問題ないと思われるので大丈夫でしょう。

実行例

$ trash --clean

「trash」スクリプト

#!/bin/bash

# home directory
HOME=`echo ~`
# trash directory
TRASH="${HOME}/.Trash"
# option string
TARGET="$@"
# first arg
ARGS=(`echo "$@"`)

# option value
CLEAN=0

if [ -z "${ARGS[0]}" ]; then
  echo -e $'\e[35mUsage: trash [option] [delete file name]'
  echo -e $'\e[35moption:'
  echo -e $'\e[35m  --clean    delete all files in .Trash directory.'
  exit
fi

for arg in ${TARGET}; do
  if [ "${arg}" = "--clean" ]; then
    CLEAN=1
  fi
done

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

for file in ${TARGET} ; do
  if [[ ! ${file} =~ ^-.*$ ]]; then
    if [ -e ${file} ]; then
      org=${file}
      if [[ ${file} =~ ^(.*)\/$ ]]; then
        file=${BASH_REMATCH[1]}
      fi
      if [[ ${file} =~ ^.*\/(.*) ]]; then
        file=${BASH_REMATCH[1]}
      fi
      fname=${file}
      loop=1
      while [ -e "${TRASH}/${fname}" ]; do
        fname="${file}.${loop}"
        loop=$((loop+1))
      done
      if [ -L ${org} ]; then
        echo -e $'\e[35mThis file is a symbolic link , it will be removed: '${org}
        rm -rf ${org}
      else
        echo -e $'\e[35m'${file}' is move to Trash.: '${fname}
        mv -f ${org} "${TRASH}/${fname}"
      fi
    else
      echo -e $'\e[35mfile not found: '${file}
    fi
  fi
done

if [ ${CLEAN} -eq 1 ]; then
  find ${TRASH} -maxdepth 1 -regex "${TRASH}/.+" -exec rm -rf {} \;
  echo -e $'\e[35mclean \".Trash\".'
else
  find ${TRASH} -maxdepth 1 -regex "${TRASH}/.*" -mtime +30 -exec rm -rf {} \;
fi