Kecilkan / reset ukuran direktori?

11

Apakah ada cara untuk mengecilkan entri direktori?

Direktori maildir dovecot saya telah meningkat dalam ukuran dari 4096 default menjadi beberapa MB, dan itu mengacaukan kuota disk.

Satu-satunya cara yang saya temukan, adalah menghapus dan membuat ulang direktori. Saya berharap ada fungsi magis di suatu tempat - saya terbuka untuk apa pun, kecuali untuk assembler berkode tangan.

Sunting: Untuk anak cucu, untuk menemukan direktori> 4096:

 find / -type d -size +4k -printf "%s\t%p\t%i\n" | sort -nr
mikewaters
sumber

Jawaban:

6

Lihat juga rm di direktori dengan jutaan file ; terkait secara tangensial, tetapi kami membahasnya di sana.

Sejauh yang saya ketahui, setidaknya pada ext2 / 3, tidak, tidak ada (online) cara untuk mengecilkan mereka sebelum menghapus + membuat ulang. Tidak terpasang, beberapa sumber menyarankan e2fsck -Dmungkin berfungsi, meskipun saya dapat mengklaim tidak ada pengalaman pribadi dengan opsi itu.

Beberapa referensi untuk bacaan lebih lanjut:

BMDan
sumber
1
Tautan pertama sangat membantu: ini membahas masalah saya secara khusus (server mail), dan fakta bahwa Ted Tso mempertimbangkan dialognya sangat keren;)
mikewaters
3

Saya baru-baru ini harus menghapus dan membuat ulang direktori NFS untuk mengecilkan ukurannya setelah sebelumnya membengkak. Dalam prosesnya, saya menemukan cara yang cukup efisien untuk melakukan ini menggunakan rsync dan tautan keras. Metode ini menghindari menyalin file yang sebenarnya, sambil tetap mencapai tujuan menciptakan direktori dengan konten yang sama.

Karena kami perlu mengambil downtime untuk melakukan operasi ini selama jendela pemeliharaan kami, membuat direktori yang dibangun kembali sesegera mungkin penting bagi kami. Jika kesederhanaan lebih penting bagi Anda, ubah perintah pindah pertama ke 'rm -rf' di direktori sumber, dan lewati perintah 'rm -rf' lainnya.

Saya mengekstrak perintah-perintah ini dari proses yang lebih besar, dan mengabstraksi nama direktori, jadi minta maaf jika saya membuat kesalahan dalam terjemahan itu.

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/

Lalu nanti, kita hapus direktori. Tergantung pada ukuran, Anda mungkin perlu menggunakan teknik yang lebih canggih untuk melakukan ini. Misalnya, menggunakan rsync dengan flag --delete untuk menyinkronkan direktori kosong ke direktori ini mungkin lebih efisien.

rm -rf /tmp/deleteme/
Dan McCarthy
sumber
2

Saya akan melakukannya seperti ini.

cp -aloldir newdir && mvolddir tempname && mvnewdir olddir && rm -rtempname

di mana olddir adalah direktori yang Anda inginkan untuk mengecilkan newdir dan tempname adalah nama file sementara

cp -almembuat tautan ke konten olddir di newdir dan tiga perintah berikutnya menukar mereka dengan newdir dan membersihkan.

pengguna313114
sumber
licin. tidak pernah tahu tentang cp -l
Kevin Buchs