1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

macOSのrmdirで.DS_Storeを無視して削除する

Posted at

問題提議

rmdirは引数が空のディレクトリの場合のみ削除するコマンドです。

rmdir dir # dirが空の場合のみ削除される
rm -r dir # dirが空かどうかに関わらず削除される

rm -rはディレクトリに何か入っているかどうかに関わらず問答無用でディレクトリを削除してしまうため、
空のディレクトリを削除する場合はrmdirを使うように習慣づけると事故防止につながります。

しかし、macOS上でrmdirを使う場合は一点厄介な問題があります。
macOSでGUIの表示設定を管理する隠しファイル.DS_Storeがディレクトリに居座っているとディレクトリが削除できなくなるのです。

mkdir dir
open dir  # GUIでdirを開く際に.DS_Storeが生成される
rmdir dir # dir/.DS_Storeが存在するためエラー

.DS_Storeは特に重要なデータを含んでいないファイルであり (特にこれから削除されようとしているディレクトリについてはなおさら)、普通はrmdirの際には無視されてほしいファイルです。

対策

.bashrc等で以下のような関数を定義することでrmdirをoverrideします。

function rmdir() {
    # PS1が定義済 (=インタラクティブシェル) の場合のみ実行
    if [[ -n "${PS1}" ]]; then
        for dir in $@; do
            dss="${dir}/.DS_Store"
            # .DS_Storeのみがdirに存在する場合のみ削除
            if [[ -d "${dir}" && `ls -a "${dir}" | wc -l | awk '{print $1}'` = 3
                              && -f "${dss}" ]]; then
                rm "${dss}"
            fi
        done
    fi
    # もとのコマンドを実行
    command rmdir $@
}

これによってインタラクティブシェルでrmdirを呼んだ場合は事前に.DS_Storeのみが削除され、結果として”.DS_Storeのみを含むディレクトリ”についても1コマンドで削除されます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?