Comment réinitialiser la taille des métadonnées du dossier sans recréer le dossier?

J'ai un dossier ( watch ) qui a été rempli de nombreux files temporaires par erreur. J'ai supprimé tous ces files, mais le dossier est toujours de 356 Ko. Par le passé, j'ai déplacé le dossier, créé un nouveau dossier portant le même nom et copié tous les files pour le redescendre à son ancienne taille. Y at-il un moyen de le redescendre à une petite taille sans recréer le dossier?

 drwxr-xr-x 2 apache apache 4096 Nov 29 2014 details drwxr-xr-x 2 apache apache 364544 Jan 21 17:24 watch drwxr-xr-x 3 apache apache 4096 Jan 21 17:19 settings 

watch a deux petits files: un file .htaccess et un file index.php.

J'ai un système de files ext4.

e4fsck supporte le drapeau -D qui semble faire ce que vous voulez:

essayez d'optimiser tous les directorys en les réindexant si le système de files prend en charge l'indexing des directorys ou en sortingant et en compressant les directorys pour les directorys plus petits ou pour les filesystems utilisant des directorys linéaires traditionnels.

Bien sûr, vous devrez démonter le système de files pour utiliser fsck , ce qui signifie time d'arrêt pour votre server.

Vous voudrez utiliser l'option -f pour vous assurer que e4fsck traite le système de files même s'il est propre.

Essai:

 # truncate -s1G a; mkfs.ext4 -q ./a; mount ./a /mnt/1 # mkdir /mnt/1/x; touch /mnt/1/x/{1..4000} # ls -ld /mnt/1/x drwxr-xr-x 2 root root 69632 Nov 22 12:54 /mnt/1/x/ # rm -f /mnt/1/x/* # ls -ld /mnt/1/x drwxr-xr-x 2 root root 69632 Nov 22 12:55 /mnt/1/x/ # umount /mnt/1 # e2fsck -f -D ./a e2fsck 1.43.3 (04-Sep-2016) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 3A: Optimizing directories Pass 4: Checking reference counts Pass 5: Checking group summary information ./a: ***** FILE SYSTEM WAS MODIFIED ***** ./a: 12/65536 files (0.0% non-contiguous), 12956/262144 blocks # mount ./a /mnt/1 # ls -ld /mnt/1/x drwxr-xr-x 2 root root 4096 Nov 22 12:55 /mnt/1/x/ 

La réponse à votre question est à toutes fins pratiques non . ext4 ne tronque pas les directorys, vous devez donc les recréer. Vous pouvez améliorer votre technique précédente en déplaçant plutôt qu'en copiant les files dans le nouveau directory, cela sera probablement beaucoup plus rapide et ne modifiera que le time de traitement des files.

S'il n'y a pas de sous-directory, vous pouvez même utiliser ln pour lier les files dans le nouveau directory.

Linux a un renameat2 système renameat2 qui peut être utilisé pour échanger deux noms, donc en supposant que vous n'avez pas de sous-directory, vous pouvez créer votre nouveau directory, lier les files de l'ancien au nouveau, puis échanger les anciens et les nouveaux directorys. Un rapide google est venu avec https://gist.github.com/eatnumber1/f97ac7dad7b1f5a9721f comme exemple de code pour appeler renameat2.

Bien sûr, tout n'est que des données, donc vous pouvez utiliser quelque chose comme debugfs ou même dd pour éditer les data structures directement sur le disque. Je ne suggérerais pas de descendre cette route pour le bien de 360KB d'espace.

en utilisant vim vous pouvez "éditer" le directory. supprimant tout sauf le ./ et ../ devrait "réinitialiser" les métadonnées des dossiers

Mon directory de téléchargements est 12k

vim Downloads/

 " ============================================================================ " Netrw Directory Listing (netrw v150) " /home/harry/Downloads " Sorted by name " Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$ " Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec " ============================================================================ ../ ./ Documents/ LeapDeveloperKit_2.3.1+31549_linux/ Leap_Motion_Installer_Packages_release_public_linux/ Moderncv Casual/ OneDrive-2015-11-24/ Resume/ g13-gui/ jpegs/ markdown-notes-linux-x64/ pebble_js_tutorial_1_1/ pios/ teamviewerqs/ xampp-linux-x64-5.6.14-4-installer.run* .swo 1452760968416.jpg 1a412bb33cb0a60077579b8bc13b2237.log.gz .... 

Voici un exemple d'un directory qui est l'habituel 4k vim Videos/

 " ============================================================================ " Netrw Directory Listing (netrw v150) " /home/harry/Videos " Sorted by name " Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$ " Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec " ============================================================================ ../ ./ EnVyUs vs NiP, Mirage - FACEIT Stage 3 Finals at Dreamhack Winter - Group B-O3pBF-3KmzM.mp4 The Tek 0201 - Is USA Like Nazi Germany-zrOo8LzvKvc.mp4 The Tek 0203 - YT Red, EU Net Neutrality Trouble, Drones Taking Jobs-IEdUcjBGyEw.mp4.part The Tek 0204 - Logan's Favorite Episode of the Year-iga7kB1NhKY.mp4 VP vs TSM, Mirage - FACEIT Stage 3 Finals at Dreamhack Winter - Group A Winners Match-3jfepl5Of0o.mp4 .swp 

Ma compréhension de la question est que les directorys sous Linux (ou * Nix) sont juste des files "spéciaux" qui peuvent stocker des informations sur les files qui vivent "en dessous". Je n'ai trouvé sur mon système que vim pourrait le faire, en utilisant nano ou d'autres ont juste montré un file vide, je suppose que la façon dont il lit les choses différemment

Voici une belle question stackexchange qui répond aux dossiers (directorys) sous Linux Comment les directorys sont-ils implémentés dans les filesystems Unix?