Remover arquivos de 0 bytes de tamanho via linha de comando?

15

Então, eu tenho um diretório cheio de outros diretórios, e eu queria saber se era possível remover arquivos que não têm tamanho. Normalmente, esses arquivos são 0 bytes e, como eu quero mesclar todos esses subdiretórios, eu poderia substituir um arquivo perfeitamente legítimo por um arquivo de 0 bytes sem peso, e lá vai meu arquivo legítimo. Qualquer maneira de remover os arquivos de zero byte?

    
por user245115 07.06.2015 / 20:25

4 respostas

32

Use o comando Localizar para localizar arquivos por tamanho e imprimir nomes de arquivos na saída padrão.

find . -type f -size 0b -print

substitua -print por -delete para excluir os arquivos em vez de imprimi-los na tela.

find . -type f -size 0b -delete
    
por user257256 07.06.2015 / 20:33
6

Encontre e remova todos os arquivos com tamanho 0 recursivamente:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Exemplo:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo
    
por A.B. 07.06.2015 / 20:31
4

Você também pode fazer isso diretamente no shell. Isso pode ser útil se você não quiser excluir arquivos ocultos vazios (aqueles cujo nome começa com . ). Embora você possa fazer isso com find , uma alternativa seria usar o próprio shell:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Explicação

  • shopt -s globstar : ativa a opção globstar do bash, que torna ** igual a um ou mais subdiretórios. **/* corresponderá a todos os arquivos e diretórios no diretório atual e em todos os seus subdiretórios.
  • for file in **/*; do ...; done : iterar todos os arquivos e diretórios encontrados;
  • [ ! -s "$file" ] : [ -s "$file" ] é verdadeiro se o arquivo existir e não estiver vazio. Portanto, [ ! -s "$file" ] (o ! inverte o teste) é verdadeiro se o arquivo não existir ou se estiver vazio.
  • [ -f "$file" ] : true se o arquivo for um arquivo normal. Não é um diretório ou um arquivo de dispositivo ou um symlink etc.
  • rm "$file" : exclua o arquivo.

O && garante que o próximo comando seja executado somente se o anterior tiver sido bem-sucedido, portanto, isso excluirá apenas arquivos vazios e regulares.

    
por terdon 07.06.2015 / 21:01
2

Embora a maioria das respostas acima esteja correta, dê uma olhada neste comando:

  

Um arquivo de tamanho de 0 byte significa um arquivo vazio

embora você possa executar este comando:

find . -type f -empty -delete

isso excluirá todos os arquivos vazios.

Você pode procurar esses arquivos antes de excluir:

find . -type f -empty
    
por Maythux 15.06.2015 / 16:50