¿Reducir / restablecer el tamaño del directorio?

11

¿Hay alguna manera de reducir una entrada de directorio?

Mis directorios dovecot maildir han aumentado de tamaño desde el 4096 predeterminado a varios megas, y está jugando con las cuotas de disco.

La única forma que he encontrado es eliminar y volver a crear el directorio. Espero que haya una función mágica en alguna parte: estoy abierto a cualquier cosa, excepto al ensamblador codificado a mano.

Editar: Para la posteridad, para encontrar directores> 4096:

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

Respuestas:

6

Vea también rm en un directorio con millones de archivos ; relacionado tangencialmente, pero lo discutimos allí.

Por lo que sé, al menos en ext2 / 3, no, no hay forma (en línea) de reducirlos a menos que elimines + recrees. Sin montar, varias fuentes sugieren que e2fsck -Dpodría funcionar, aunque no puedo afirmar que no tenga experiencia personal con esa opción.

Algunas referencias para lecturas adicionales:

BMDan
fuente
1
El primer enlace fue especialmente útil: abordó mi problema específicamente (servidores de correo), y el hecho de que Ted Tso intervino en el diálogo es bastante bueno;)
mikewaters
3

Recientemente tuve que eliminar y volver a crear un directorio NFS para reducir su tamaño después de que se había hinchado previamente. En el proceso, encontré una forma bastante eficiente de hacer esto usando rsync y enlaces duros. Este método evita copiar los archivos reales, sin dejar de cumplir el objetivo de recrear el directorio con el mismo contenido.

Dado que necesitábamos tomarnos un tiempo de inactividad para realizar esta operación durante nuestra ventana de mantenimiento, era importante que el directorio reconstruido estuviera disponible lo antes posible. Si la simplicidad es más importante para usted, cambie el primer comando de movimiento a 'rm -rf' en el directorio de origen y omita el otro comando 'rm -rf'.

Extraje estos comandos de un proceso más grande y abstraje los nombres de directorio, así que disculpen si me he equivocado en esa traducción.

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/

Luego, más tarde, eliminamos el directorio. Dependiendo del tamaño, es posible que necesite usar una técnica más sofisticada para hacer esto. Por ejemplo, usar rsync con el indicador --delete para sincronizar un directorio vacío en este directorio puede ser más eficiente.

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

Lo haría así.

cp -aloldir newdir && mvolddir nombre de && mvtemp newdir olddir nombre de && rm -rtemp

donde olddir es el directorio que desea reducir newdir y tempname son nombres de archivo temporales

cp -alcrea enlaces al contenido de olddir en newdir y los siguientes tres comandos los intercambian con newdir y limpian.

usuario313114
fuente
resbaloso. nunca supe de cp -l
Kevin Buchs