バックアップファイルを削除する


0. Contents

1. Concept
2. Script Source
3. How to Use


1. Concept

find と正規表現の練習を兼ねて作成したサブルーチン。
色々な所で見かける、練習問題的なスクリプトである。

ファイル名に改行コードを含むファイルには未対応で、おそらく GNU find が必要。


2. Script Source

ソースは以下の通り (ダウンロード)。

#! /usr/bin/env bash

function dbf(){
## 変数をセット
  local File Dir="$HOME" COpt

## 引数をチェック
  while (( $# > 0 )) ; do
    case "$1" in
      -d|--depth)
        if [ "$2" -gt 0 ] 2>&- ; then
          COpt="-maxdepth $2"

        else
          echo "error: $FUNCNAME: $1 $2: Invalid argument." 1>&2
          return 1
        fi && shift
      ;;

      *)
        if [[ -d "$1" ]] ; then
          if [[ -r "$1" && -x "$1" ]] ; then
          ## フルパスを取得
            Dir=$( builtin cd "$1"; echo "$PWD" )

          else
            echo "error: $FUNCNAME: $1: Permission denied." 1>&2
            return 1
          fi

        else
          echo "error: $FUNCNAME: $1: Invalid option." 1>&2
          return 1
        fi
      ;;
    esac && shift
  done

## 削除対象ファイルを検索
  echo "$FUNCNAME: Searching for backup files..."
  File=$(
    find "$Dir" $COpt \! -type d -iregex '.*\(~$\|\.bak$\|\/\#.*\#$\|\/\.\#.*\)' 2>&-
  )

  [[ -n "$File" ]] || {
    echo -e "\n$FUNCNAME: No backup files." 1>&2
    return 1
  }

## 確認後, ファイルを削除
  echo -e "\n${File}\n"
  read -p "$FUNCNAME: Delete Now ? [y/N] : "
  [[ "$REPLY" == [yY] ]] && echo || {
    echo "$FUNCNAME: quit." 1>&2
    return 1
  }

  echo "$File" |while read -r ; do
    rm -v "$REPLY" || exit
  done && echo -e "\n$FUNCNAME: done."
}
dbf "$@"


3. How to Use

削除対象ファイル名は以下。

USAGE、OPTION は以下の通り。

USAGE: dbf (Options) (Directory)

   -d, --depth [Num]
      : set maxdepth for find

   [Directory]
      : set check dir (default: $HOME)