Como remover muitos (200.000) arquivos?

17

Preciso remover 200.000 arquivos (todos eles) de uma pasta e não quero excluir a própria pasta.

usando rm, recebo um erro "A lista de argumentos é muito longa". Eu tentei fazer algo com xargs, mas não sou um Shell Guy, portanto não funciona:

find -name * | xargs rm -f
FMaz008
fonte
5
Por que não excluir a pasta e recriá-la após a exclusão?
garconcn

Respostas:

35
$ find /path/to/folder -type f -delete
quanta
fonte
15
Provavelmente vale a pena mencionar que o GNU find (usado pela maioria das distribuições Linux) pode excluir arquivos por conta própria -delete. Isso também evita problemas com arquivos que contêm aspas ou caracteres de nova linha (embora você possa usar -print0as -0opções do GNU find e GNU xarg para corrigir isso).
DerfK 26/09
3
@ DerfK, boa observação! Além disso, muitas pessoas tendem a brincar xargsenquanto isso findtem -exec command {} +sintaxe.
poige 26/09
5

Você está fazendo tudo certo. É o '*' que lhe dá um problema (o shell está expandindo-o para a lista de arquivos em vez de find). A sintaxe correta pode ser:

cd <your_directory>; find . -type f | xargs rm -f
find <your_directory> -type f | xargs rm -f

(O último é um pouco menos eficiente, pois passará nomes mais longos xargs, mas você dificilmente notará :-))

Como alternativa, você pode escapar do seu '*' assim (no entanto, nesse caso, ele também tentará remover "." E ".."; não é nada demais - você receberá apenas um pequeno aviso :-)):

find . -name '*' | xargs rm -f
find . -name "*" | xargs rm -f
find . -name \* | xargs rm -f

Se seus nomes de arquivos contiverem espaços, use o seguinte:

find . -type f -print0 | xargs -0 rm -f
dtoubelis
fonte
1
Isso não funciona se você tiver um nome de arquivo que contenha um espaço.
user9517 suportadoGoFundMonica
@lain: Sim, eu estava em um processo de editar a minha resposta para incluir o truque para espaços em branco :-)
dtoubelis
3

O comando a seguir excluirá todos os arquivos do diretório atual :

find . -type f -exec rm {} \;
George Tasioulis
fonte
2
-name '*'não significa "todos os arquivos". Os arquivos são ditos com:-type f
poige 26/09
2

podes tentar

find /path/to/folder -type f -print0  | xargs -0 rm -f

ou

find /path/to/folder -type f -exec rm -f "{}" +
user9517 suportadoGoFundMonica
fonte
1

Parabéns pela resposta, aqui estão algumas adições.

Se você deseja excluir arquivos com um padrão de nome específico, pode escrevê-lo assim. Também foi adicionado -print para que você possa ver o que está acontecendo enquanto os arquivos estão sendo excluídos.

sudo find /home/mydirectory -name "*.jpg" -type f -print -delete

Isso, por exemplo, exclui todos os jpegs no meu diretório.

Waltur Buerk
fonte