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


16

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

Respostas:


34

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 -printpor -deletepara excluir os arquivos em vez de imprimi-los na tela.

find . -type f -size 0b -delete

Agora, existe alguma maneira de mover arquivos de um local para outro e, com os conflitos, substitua se o tamanho for o mesmo, mas mantenha as duas cópias se o tamanho for diferente?
precisa saber é o seguinte

Isso parece um trabalho para o rsync .

7
Você pode usar em -emptyvez de -size 0b.
Kevin

6

Localize e remova todos os arquivos com o 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

4

Você também pode fazer isso diretamente no shell. Isso pode ser útil se você não desejar excluir arquivos ocultos vazios (aqueles cujo nome começa com a .). Embora você também possa fazer isso 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 para bash, que faz **corresponder um ou mais subdiretórios. **/*corresponderá a todos os arquivos e diretórios no diretório atual e a todos os seus subdiretórios.
  • for file in **/*; do ...; done : repete todos os arquivos e diretórios encontrados;
  • [ ! -s "$file" ]: [ -s "$file" ]é verdadeiro se o arquivo existir e não estiver vazio. Portanto, [ ! -s "$file" ]( !inverte o teste) é verdadeiro se o arquivo não existir ou se estiver vazio.
  • [ -f "$file" ]: true se o arquivo for regular. Não é um diretório ou arquivo de dispositivo ou link simbólico etc.
  • rm "$file" : exclua o arquivo.

A &&garantir que o próximo comando é executado somente se o anterior foi bem sucedida até isso só vai apagar, arquivos regulares vazias.


e eu pensei, minha resposta é complicada :) +1
AB

2

Embora a maioria das respostas acima esteja correta, observe este comando:

Um arquivo com 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 dar uma olhada nesses arquivos antes de excluir:

find . -type f -empty

No Ubuntu 14.04 LTS, sem o -type f, -emptytambém excluirá diretórios vazios. Apenas verifiquei a página de manual.
Bulrush
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.