Como faço para redefinir o tamanho dos metadados da pasta sem recriar a pasta?

6

Eu tenho uma pasta ( watch ) que foi preenchida com muitos arquivos temporários por engano. Esvaziei todos esses arquivos, mas a pasta ainda tem 356 kB de tamanho. No passado, movi a pasta para fora do caminho, criei uma nova pasta com o mesmo nome e copiei todos os arquivos para que ela voltasse ao tamanho antigo. Existe alguma maneira de voltar a um tamanho pequeno sem recriar a pasta?

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 tem dois arquivos pequenos: um .htaccess e um index.php.

Eu tenho um sistema de arquivos ext4.

    
por Austin Burk 21.01.2016 / 23:33

3 respostas

3

e4fsck suporta -D sinalizador que parece fazer o que você quer:

try to optimize all directories, either by reindexing them if the filesystem supports directory indexing, or by sorting and compressing directories for smaller directories, or for filesystems using traditional linear directories.

Claro, você precisará desmontar o sistema de arquivos para usar fsck , o que significa tempo de inatividade para o seu servidor.

Você desejará usar a opção -f para garantir que e4fsck processe o sistema de arquivos, mesmo se estiver limpo.

Teste:

# 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/
    
por 22.11.2016 / 12:36
2

A resposta à sua pergunta é para todos os fins práticos no . O ext4 não trunca diretórios, então você precisa recriá-los. Você pode melhorar sua técnica anterior movendo em vez de copiar os arquivos para o novo diretório, isso provavelmente será muito mais rápido e apenas alterará o tempo dos arquivos.

Se não houver subdiretórios, você poderá usar ln para vincular os arquivos ao novo diretório.

O Linux tem uma chamada de sistema renameat2 que pode ser usada para trocar dois nomes, então, assumindo que você não possui subdiretórios, você pode criar o novo diretório, vincular os arquivos do antigo ao novo e trocar os antigos e antigos. novos diretórios. Um rápido google surgiu com link como código de exemplo para chamar renameat2.

É claro que tudo é apenas dados para que você possa usar algo como debugfs ou mesmo dd para editar as estruturas de dados diretamente no disco. Eu não sugeriria ir por esse caminho por 360KB de espaço.

    
por 17.11.2016 / 10:34
0

usando vim você pode "editar" o diretório. remover todos, mas ./ e ../ devem "redefinir" os metadados das pastas

Meu diretório de downloads é 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
....

Aqui está um exemplo de um diretório que é o usual 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

Meu entendimento do assunto é que os diretórios do Linux (ou * Nix) são apenas arquivos "especiais" que podem armazenar informações sobre arquivos que vivem "abaixo" dele. Eu encontrei no meu sistema apenas vim poderia fazer isso, usando nano ou outros apenas mostraram um arquivo em branco, eu acho que a maneira como ele lê as coisas de maneira diferente

Aqui está uma boa pergunta do stackexchange que responde quais pastas (directorys) estão sob Linux Como os diretórios são implementados em sistemas de arquivos Unix?

    
por 22.01.2016 / 00:00