問題提議
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コマンドで削除されます。