Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 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
digitarhythm
いろいろ作っています。 フルスタックフレームワーク「ViewllerJS」 https://www.digitarhythm.net/viewllerjs ブラウザでWebゲーム開発「enforceIDE」 https://www.prominence.tv/enforceIDE WebブラウザでProcessing「InstaProc」 https://processing.fun/
http://www.digitarhythm.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away