Réduire / réinitialiser la taille du répertoire?

11

Existe-t-il un moyen de réduire une entrée de répertoire?

La taille de mes répertoires maildir de dovecot est passée de la valeur par défaut 4096 à plusieurs mégaoctets, et il dérange les quotas de disque.

Le seul moyen que j'ai trouvé, est de supprimer et recréer le répertoire. J'espère qu'il y a une fonction magique quelque part - je suis ouvert à tout, sauf pour l'assembleur codé à la main.

Edit: Pour la postérité, pour trouver des dirents> 4096:

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

Réponses:

6

Voir aussi rm sur un répertoire contenant des millions de fichiers ; tangentiellement liés, mais nous en discutons ici.

Pour autant que je sache, au moins sur ext2 / 3, non, il n'y a aucun moyen (en ligne) de les réduire avant de supprimer + recréer. Démonté, plusieurs sources suggèrent que cela e2fsck -Dpourrait fonctionner, bien que je ne puisse prétendre à aucune expérience personnelle avec cette option.

Quelques références pour plus de lecture:

BMDan
la source
1
Le premier lien était particulièrement utile: il traitait spécifiquement de mon problème (serveurs de messagerie), et le fait que Ted Tso ait pesé dans le dialogue est plutôt cool;)
mikewaters
3

J'ai récemment dû supprimer et recréer un répertoire NFS pour réduire sa taille après qu'il ait déjà gonflé. Dans le processus, j'ai trouvé un moyen assez efficace de le faire en utilisant rsync et des liens durs. Cette méthode évite de copier les fichiers réels, tout en atteignant l'objectif de recréer le répertoire avec le même contenu.

Étant donné que nous devions prendre des temps d'arrêt pour effectuer cette opération pendant notre fenêtre de maintenance, il était important pour nous de rendre le répertoire reconstruit disponible dès que possible. Si la simplicité est plus importante pour vous, changez la première commande de déplacement en «rm -rf» dans le répertoire source et ignorez l'autre commande «rm -rf».

J'ai extrait ces commandes d'un processus plus large et j'ai résumé les noms des répertoires, donc excuses si j'ai fait une erreur dans cette traduction.

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/

Plus tard, nous supprimons le répertoire. Selon la taille, vous devrez peut-être utiliser une technique plus sophistiquée pour ce faire. Par exemple, l'utilisation de rsync avec l'indicateur --delete pour synchroniser un répertoire vide dans ce répertoire peut être plus efficace.

rm -rf /tmp/deleteme/
Dan McCarthy
la source
2

Je le ferais comme ça.

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

olddir est le répertoire que vous souhaitez réduire newdir et tempname sont des noms de fichiers temporaires

cp -alcrée des liens vers le contenu de olddir dans newdir et les trois commandes suivantes les échangent avec newdir et nettoient.

user313114
la source
nappe. n'a jamais connu cp -l
Kevin Buchs