Remoção recursiva de arquivos com tamanho inferior a 1 MB


Respostas:


21

Isso pode ser feito com find:

find . -type f -size -1M -exec rm {} +

Observe que isso recursivamente será subdividido em subdiretórios e excluirá incondicionalmente todos os arquivos menores que 1 megabyte. Seja cuidadoso.


você está perdendo o argumento caminho parafind

@ Useless: Isso é GNU find. :)
Sven Marnach

2
@DanielAndersson: findrestringe o número de argumentos ao processo chamado para se ajustar aos limites do sistema, em contraste com o rm *que é garantido como uma invocação de processo único. findinvocará várias instâncias, rmse necessário. E tenho certeza de que caracteres especiais são tratados corretamente, incluindo caracteres de nova linha. Prefiro -exec rmmais -deletepor motivos de flexibilidade - como exemplo, o último não oferece nenhuma maneira de excluir arquivos protegidos contra gravação.
Sven Marnach 13/02/12

1
@ Invoker: Eu reverti sua alteração, pois estava incorreta. -1Msignifica menos de um megabyte, conforme desejado. Sua versão excluiria todos os arquivos com exatamente um megabyte de tamanho, o que parece ser uma operação um tanto inútil.
Sven Marnach

2
Para quem estiver interessado, se você quiser remover todos os arquivos maiores que 1 M, use o comando find . -type f -size +1M -exec rm {} +. Observe o + 1 milhão em vez de -1 milhão.
Chessofnerd 06/10/2015

10

Isso deve fazer o trabalho:

$ find <directory> -type f -size -1M -delete

Eu não acho que precisamos hífen a partir de 1 milhão.
Invoker 05/10

2
@ Invoker, acredito que o -sinal seja um sinal de menos que significa "menos de 1 milhão". Se você executar find <directory> -type f -size +1M -delete, excluirá todos os arquivos maiores que 1 milhão.
Chessofnerd

Sim, você está certo, meu mal
Invoker

2

Apenas pela variedade e um possível ganho de desempenho (provavelmente marginal):

find <directory> -type f -size -1M -print0  | xargs -0 rm

Como isso deve ser mais rápido? Inicia um xargsprocesso adicional .
Sven Marnach 8/12

Agora você pode ter duas CPUs disputando o mesmo dispositivo de bloco! Mais sensatamente, as operações stat / readdir não são bloqueadas de forma síncrona pela operação de desvinculação. Se isso é provável que seja melhor, obviamente, depende do tamanho da subárvore, número de arquivos, o dispositivo etc.

1

Experimentar

encontrar . -size -1M -exec rm {} \;


1
Isso é ótimo para usuários não-GNU. Obrigado! o mesmo que a resposta de @ Sven, mas com \;no final, em vez de+
hamx0r 18/08/16

-1

Você pode conferir este link http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , que tem exatamente o que você deseja.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

Você pode percorrer todos os arquivos com um loop for e, em seguida, usar du e awk para encontrar o tamanho do arquivo como no exemplo acima.


As respostas no SO devem ser independentes - não publique um mero link. (Além disso, o código na pós ligada elimina ficheiros vazias em vez de arquivos menores do que 1 M.)
Sven Marnach

@SvenMarnach não podemos usar $ file_size <1M no link de exemplo de código fornecido.

Não, não podemos, pois o shell não vai entender 1M.
Sven Marnach 8/12

Por 1M, eu quis dizer 1048576 a conversão de 1 MB em byte

1
Bem, se você testar se isso realmente funciona e copiar o código para sua resposta, isso poderá se tornar uma resposta SO.
Sven Marnach 8/02
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.