[Shell] 空のフォルダを一括削除

2016年3月25日

Shell テクノロジー プログラミング

サービス運用していたり、データの登録削除を繰り返している様な環境で、単一ファイルを1フォルダ内で管理しているような場合はいいのですが、 日別やユーザーディレクトリ別のフォルダを作って、データを管理していたり、ネストが深く構築されるようなシステムの場合、 しばらく使用していると、中身のデータは削除されているが、フォルダは空になっていて、ゴミ化しているケースも少なくないでしょう。 ディレクトリの存在自体を判定しているようなシステムでは、あまり削除をしないほうがいいのですが、 そうではなく、ゴミディレクトリが散在している場合は、整理に困るはずです。 1つずつrmコマンドを叩いていってもいいのですが、2桁以上の数になると人力で行うのはかなり嫌気がさす作業になることでしょう。 今回のツールはそんな空ディレクトリをコマンド一発で削除して取り除いてくれるツールです。

ソースコード

removeEmptyFolder.sh

#!/bin/bash ### # Remove Empty Folder # # property-- # date : 2016/3/24 # written : yugeta koji # # version-- # v1.0 : # # Issue-- # if there is a space in the folder-name, an error. ### ## Target-folder TARGET=$1 ## get-Directory-lists LIST=`find ./$TARGET -type d | sort -r` ## for for i in ${LIST[@]} do ## get-folder-in-list(file or symbolic) localList=`find $i -type f -type f -or -type l` ## Delete empty-folder if [ ${#localList} -eq 0 ] then `rm -rf $i` echo $i fi done

使い方

$ sh ./removeEmptyFolder.sh [%Target-Folder%] [%Target-Folder%]に対象のフォルダをフルパス(またはソースファイルからの相対パス)で記述してあげると、それ以下の空ディレクトリを強制削除してくれます。

解説

一度rootディレクトリからfindでディレクトリだけの一覧を取得して(この時逆ソートかけてます)、それをloopさせて、内部にファイルまたはシンボリックリンクがない場合のみフォルダ削除を行います。 ※逆ソート欠けているのは、フォルダの中にフォルダがある場合、1つずつ削除していくほうがトラブルが起きないため、この方式を採用してます。

既知の不具合

フォルダ名に半角スペースが入っている場合、そのディレクトリに対して正常に判定ができなくなる場合があるので、その場合は改修する必要があります。 ・・・が、現時点であまりそういったディレクトリ名はエンジニア環境では作ることが望ましくないということぐらいはわかっているので、今回のバージョンでは見送り! Let's do it.

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。