ディレクトリエントリを縮小する方法はありますか?
私のdovecotmaildirディレクトリのサイズが デフォルトの4096 から数メガに増加し、ディスククォータが混乱しています。
私が見つけた唯一の方法は、ディレクトリを削除して再作成することです。私はどこかに魔法の機能があることを望んでいます-私は手作業でコーディングされたアセンブラを除いて、何でも開いています。
編集:後世のために、急流を見つける> 4096:
find / -type d -size +4k -printf "%s\t%p\t%i\n" | sort -nr
参照 数百万のファイルがあるディレクトリのrm ;接線方向に関連していますが、そこで説明します。
私の知る限り、少なくともext2/3では、いいえ、削除+再作成以外にそれらを縮小する(オンライン)方法はありません。アンマウント、いくつかのソースはe2fsck -D
は機能するかもしれませんが、そのオプションでの個人的な経験はありません。
さらに読むためのいくつかの参照:
私は最近、以前に肥大化した後、NFSディレクトリを削除して再作成し、サイズを縮小する必要がありました。その過程で、rsyncとハードリンクを使用してこれを行うかなり効率的な方法を見つけました。この方法では、実際のファイルのコピーを回避しながら、同じ内容でディレクトリを再作成するという目標を達成します。
メンテナンス期間中にこの操作を行うにはダウンタイムをとる必要があったため、再構築されたディレクトリをできるだけ早く利用できるようにすることが重要でした。単純さがより重要な場合は、最初の移動コマンドをソースディレクトリの「rm-rf」に変更し、他の「rm-rf」コマンドをスキップします。
これらのコマンドをより大きなプロセスから抽出し、ディレクトリ名を抽象化したので、その変換で間違いを犯した場合はお詫びします。
mkdir /tmp/holding_dir/
rsync -ai --delete --link-dest=/path/to/source_dir/ /path/to/source_dir/ /tmp/holding_dir/
mv /path/to/source_dir/ /tmp/deleteme/
mv /tmp/holding_dir/ /path/to/source_dir/
その後、ディレクトリを削除します。サイズによっては、これを行うためにより高度な手法を使用する必要がある場合があります。たとえば、rsyncを--deleteフラグとともに使用して、空のディレクトリをこのディレクトリに同期すると、より効率的になる場合があります。
rm -rf /tmp/deleteme/
私はこのようにします。
cp -al
oldirnewdir&& mv
olddirtempname&& mv
newdirolddir&& rm -r
tempname
ここで、olddirは縮小するディレクトリですnewdirおよびtempnameは一時的なファイル名です
cp -al
はolddirのコンテンツへのリンクをnewdirに作成し、次の3つのコマンドはそれらをnewdirと交換してクリーンアップします。