Como posso excluir todos os arquivos de um diretório quando ele relata “Lista de argumentos muito longa”

11

Eu tenho um diretório com algumas centenas de milhares de arquivos.

Eu quero apagar todos os arquivos, mas rm * -f reporta: "lista de argumentos muito longa"

Qual é a melhor maneira de limpar esse diretório?

    
por Brent 24.07.2009 / 17:58

8 respostas

11

Se você não conseguir remover o diretório, sempre poderá usar o find.

find . -maxdepth 1 -type f -exec rm -f {} \;

Isso excluirá todos os arquivos no diretório atual e apenas o diretório atual (não os subdiretórios).

    
por 24.07.2009 / 18:08
21
find . -maxdepth 1 -type f -exec rm -f {} \;

simplesmente demora muito (um exec de rm por arquivo).

este é muito mais eficiente:

find . -maxdepth 1 -type f -print0 | xargs -r0 rm -f

como são necessários tantos nomes de arquivos quanto argumento para rm, então executa rm com o próximo carregamento de nomes de arquivos ... pode acontecer que rm seja chamado apenas de 2 ou 3 vezes.

    
por 24.07.2009 / 19:52
6

Ambos irão contornar o problema. Há uma análise do respectivo desempenho de cada técnica em aqui .

find . -name WHATEVER -exec rm -rf {} \;

ou

ls WHATEVER | xargs rm -rf

O problema vem do bash expandindo "*" com qualquer item no diretório. Ambas as soluções funcionam em cada arquivo, por sua vez.

    
por 24.07.2009 / 18:05
3

Consegui fazer isso fazendo backup de um nível:

cd ..

e em execução:

rm directory name -rf

E, em seguida, recriar o diretório.

    
por 24.07.2009 / 18:01
2

Todas essas invocações são muito legais, mas raramente me lembro exatamente da nomenclatura necessária quando estou com pressa: ao invés disso, eu uso ls. Como alguém menciona, ls. iria funcionar, mas eu prefiro ls -1 como em:

ls -1 | xargs -n 100 rm -rf

A figura -n xxx é bastante segura para brincar, já que exceder o máximo será corrigido automaticamente (se size-max for excedido; consulte -s) ou se o args-max de um aplicativo for excedido, ele será geralmente é bastante óbvio.

Deve-se notar que o grep é útil para inserir no meio desta cadeia quando você deseja excluir apenas um subconjunto de arquivos em um diretório grande e, por alguma razão, não deseja usar o find.

Esta resposta assume que você está usando os utilitários principais do Gnu para seus arquivos ls, xargs & etc.

    
por 28.07.2009 / 15:02
1

Você pode usar a opção -exec + para descobrir qual deles tentará executar rm o menor número de vezes possível, o que pode ser mais rápido.

find . -type f -exec rm '{}' +
    
por 28.07.2009 / 10:30
0

Aqui está uma versão para excluir um grande número de arquivos quando o sistema precisa permanecer responsivo.

Funciona emitindo o trabalho em pequenos lotes (100 arquivos por padrão) e esperando um pouco para que outros trabalhos sejam concluídos.

Trabalhei de forma brilhante para excluir mais de meio milhão de arquivos do diretório único no ext3. Imprime porcentagem feita como um pequeno bônus

noOfFiles='ls -U | wc -l'
n=0
while (ls -U | tail -n 100 | xargs rm -f); do 
   n=$((n+100));
   sync;
   echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
   sleep 5;
done
    
por 26.04.2012 / 18:15
0

Soluciona erros "argumento muito longo" ou "não pode alocar memória"

Isso fez o truque em 220.000+ arquivos na pasta de sessão ...

Vantagem: instantaneamente começa a remover arquivos

cd path/to/folder
ls -f | xargs rm -f -v

CLIQUE para captura de tela dos arquivos sendo removidos - (removeu todos os arquivos em ~ 15min)

-f (depois de ls) impede de pré-ordenar

-v (após rm) exibe cada arquivo como sendo removido

-f (depois de rm) força sem prompt nos arquivos protegidos contra gravação

Dica: Renomeie a pasta (ex sessão para session_old) primeiro para evitar a adição de arquivos autogerados adicionais enquanto você estiver tentando excluir arquivos. Você pode refazer o diretório original manualmente se não for automaticamente, como no meu caso

    
por 16.02.2017 / 10:53

Tags