Como posso excluir todos os arquivos de um diretório quando ele informa "Lista de argumentos muito longa"


Respostas:


11

No caso de você não poder 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 somente o diretório atual (não os subdiretórios).


quase perfeito (veja meu post também) #
asdmin

2
No Linux, você pode fazer isso ainda mais rápido usando "+" em vez de "\;". Isso fará com que remova mais arquivos por "rm" de uma só vez.
Thomas

5
Ainda mais rápido: find dir/to/delete -delete(não gera um rmprocesso por arquivo a ser excluído).
Morten Siebuhr

Morten: Ele nunca mencionou querer excluir o diretório em si, disse ony os arquivos. find dir/to/delete -type f -delete
richo

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

simplesmente leva muito tempo (um exec de rm por arquivo).

este é muito mais eficiente:

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

como leva o máximo de nomes de arquivos como argumento para rm, tanto quanto possível, em seguida, executa rm com a próxima carga de nomes de arquivos ... pode acontecer que rm seja chamado apenas 2 ou 3 vezes.


5
Fico feliz em ver alguém saber como o find funciona ... Considere também, com o novo gnu find, a ação -delete ou o comando -exec {} +, que age como xargs. Veja a seção Ações de 'man find'.
Kyle Brandt

Eu não sabia sobre -exec cmd {} +. Isso parece bastante útil. Um pouco mais genérico do que -delete :)
David Pashley

-delete pode ser bom, mas eu pessoalmente prefiro comandos que podem ser usados ​​em várias máquinas. Solaris sistemas com quem trabalho são mais velhos, então -delete não iria trabalhar com eles
asdmin

2
Adicionar um ionicepouco antes rmé uma boa ideia se o computador for usado por outras pessoas ao mesmo tempo.
26812 Hubert Kario

6

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

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

ou

ls WHATEVER | xargs rm -rf

O problema decorre da expansão do bash "*" com o item everysingle no diretório. Em vez disso, essas soluções funcionam em cada arquivo.


2
A solução find é mais lenta com muitos arquivos, pois invoca o comando rm para cada arquivo. A solução xargs é mais rápida, mas só funciona quando os nomes de arquivos não contêm espaços (caso contrário, você precisa encontrar e encontrar o GNU find . -print0 | xargs -0 rm).
robcast

"find. -name WHATEVER -print0 | xargs -0 rm -rf" será mais eficiente. O find irá bifurcar um rm para cada arquivo, enquanto o xargs o reduzirá ao mínimo. Você precisa de -print0 e -0 para lidar com arquivos com espaços. Você provavelmente também deseja usar -thth na localização, para fazer uma primeira pesquisa aprofundada.
22660 David Pashley

O comando ls não funcionará, pois isso também retorna "a lista de argumentos muito longa"
Brent

2
Você está fazendo " ls *", e o " *" se expande para a lista de argumentos que seu shell reclama por ser muito longa. Faça " ls ." em vez disso (ou suba um nível de diretório e faça " ls [dirname]").
James Sneeringer

A segunda linha de comando (ls QUE QUER | xargs rm -rf) não trabalho para a mesma razão que a questão não funcionou: o que seria substituí da pela Shell a um comprimento superior
asdmin

3

Consegui fazer isso fazendo backup de um nível:

cd ..

E correndo:

rm directory name -rf

E, em seguida, recrie o diretório.


1
funciona apenas se você não precisar ter o diretório permanentemente e todos os arquivos e diretórios serão excluídos recursivamente. na maioria dos casos da minha vida, dessa maneira não teria funcionado.
asdmin 26/07/2009

2

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

ls -1 | xargs -n 100 rm -rf

O número -n xxx é bastante seguro, pois o excedente do máximo será corrigido automaticamente (se o tamanho máximo for excedido; consulte -s) ou, se o args-max de um aplicativo for excedido, geralmente será bastante óbvio.

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

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


Isso funcionará com um diretório muito grande para "ls" funcionar? (mesmo erro - lista argumento muito longo)
Brent

Sim Brent: apenas certifique-se de não usar um especs. De arquivo ao chamar ls. Use apenas o -1 (traço Um), como mostrado acima. E, como explicado acima, use grep após o ls se precisar parear a lista de arquivos. Se você estiver recebendo o erro "muito longo" após ter certeza de que não está usando caracteres curinga com ls, talvez o xargs esteja reclamando. Use 'xargs -n 5' em vez de 'xargs -n 100' e você definitivamente deve estar seguro, se um pouco mais lento.
Rixtertech

1

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

find . -type f -exec rm '{}' +

0

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

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

Trabalhou brilhantemente 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

0

Resolve erros de "argumento muito longo" ou "não é possível alocar memória"

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

Vantagem: inicia a remoção instantânea de arquivos

caminho do CD / para / pasta
ls -f | xargs rm -f -v

CLIQUE para ver a captura de tela dos arquivos que estão sendo removidos - (todos os arquivos foram removidos em ~ 15 minutos)

-f (após ls) evita a pré-classificação

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

-f (depois da rm) passa sem nenhum aviso nos arquivos protegidos contra gravação

Dica: renomeie a pasta (ex-sessão para session_old) primeiro para impedir que arquivos adicionais gerados automaticamente sejam adicionados enquanto você estiver tentando excluir arquivos. Você pode refazer o diretório original manualmente, se não o fizer automaticamente, como no meu caso


O que há de novo na sua resposta que estava faltando nas anteriores?
user2233709
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.