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.

Sven Marnach
fonte
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
jcollado
fonte
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
Sem utilidade
fonte
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 {} \;

ahvargas
fonte
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.

Steen Schütt
fonte
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