前書き
作業中に「指定した1ファイル以外全消し」をする機会が多くて、コマンド1発で実現したかった。
ググればいっぱい出てくるんだけれど、
「隠しファイル・隠しフォルダに対応してない」
「ファイル名が同じならパスが違っても生き残る」
「強引でちょっと怖い」
などなどで、思う通りの挙動をするものが無かったので作りました。1
※ファイル削除が絡むので、利用は慎重に、自己責任でお願いします。
コマンド内容
下記を .bashrc
に追記。
.bashrc
function rm-without() {
# 第1引数で指定したパス&ファイル名のモノ以外のファイル削除(完全一致)
find . -type f | sed 's/^\.\///' | grep -v "^$1$" | xargs rm -f
# 空になったディレクトリ削除
find . -type d -empty -delete
}
使い方
# source ~/.bashrc を忘れないでね!
$ rm-without sftp-config.json
解説
-
find . -type f
で現在のディレクトリ以下のファイルを列挙。 - 行頭に
./
がつくので、置換処理(sed 's/^\.\///'
)で排除。- 引数と同じ名前形式にしたかった。
-
grep -v "^$1$"
で第1引数に完全一致するもの以外を抽出。 - xargs rm -f で削除。
-
find . -type d -empty -delete
で空のディレクトリを削除(便利!)- rmdirだと警告出る可能性があったので使わない方向にした。
あとがき
ごくごく細部のことですが、ググってもいいのが見つからなかったので…。
「1つ1つの処理フローの意図を明確に」をモットーに書いた。
参考文献
目的のファイル以外を削除するコマンド - びぶろく
bashで複数コマンドのエイリアス - Qiita
sedコマンドの備忘録 - Qiita
空のディレクトリを再帰的に消す - システム開発メモ
-
bash
使いなので、bash
でしか動作確認していないですが、そんな変なことしていないので、多分zsh
でも動くんじゃないかなーと思っています。 ↩