Exclui arquivos do diretório: memória esgotada

1

Esta questão é uma continuação lógica de Como posso excluir todos os arquivos de um diretório quando ele relata" Lista de argumentos muito longa "

Eu tenho

drwxr-xr-x  2 doreshkin doreshkin 198291456 Apr  6 21:35 session_data

Eu tentei

find session_data -type f -delete
find session_data -type f | xargs rm -f
find session_data -maxdepth 1 -type f -print0 | xargs -r0 rm -f

O resultado é o mesmo:

find: memory exhausted

O que posso fazer para remover este diretório?

    
por codeholic 06.04.2010 / 19:59

6 respostas

2

Parece um problema com find . Eu notei alguns relatos de bugs de pessoas recebendo esse erro com uma versão específica de findutils do GNU.

Você pode tentar substituir "localizar" por "ls" e "grep". Algo parecido com isto:

cd somedir
\ls -f | grep "something" | xargs -d "\n" rm

A barra invertida em \ls em vez de ls diz ao bash para ignorar todos os aliases que afetarão seu formato de saída. Você também pode dizer /bin/ls se esquecer o truque de barra invertida. A opção -f diz para desativar a classificação (que economiza tempo / memória) e incluir arquivos ocultos. O argumento -d "\n" para xargs informa que ele é dividido em novas linhas em vez de espaços. Note que -d não é suportado em todas as versões do xargs, o que é uma pena.

Observe que ls something* não funcionará, pois o something* é expandido no bash, não pelo ls, e resultará em um erro "lista muito longa". É por isso que você canaliza o resultado pelo grep.

    
por 06.04.2010 / 21:09
1

Os resultados da descoberta de tubulação por meio da cabeça parecem funcionar para mim (tenho um problema semelhante no qual fotos de câmeras de segurança de 6 câmeras foram enviadas uma vez por minuto)

find . -type f | head -1000 | xargs rm

Se isso acontecer, faça um loop:

for i in {1..999}
do
   find . -type f | head -1000 | xargs rm
done

Substitua 999 com quantos milhares de arquivos estão lá (se você souber).

    
por 06.04.2010 / 20:55
0

Tente usar ls em vez de encontrar ( ls -1 | xargs rm ).

Ou

Use um loop for sobre a saída de ls

#!/bin/sh
for i in 'ls -1'; do
  rm $i
done

(em ambos os casos, se você ainda estiver tendo problemas, o shell pode estar atingindo um limite máximo de memória: experimente canalizar ls a head para encurtar a lista)

Ou

Escreva em perl / C / etc. (iterando a saída de readdir e a coleta de lixo à medida que você avança)

... provavelmente há mais casos de "ou", mas isso vem imediatamente à mente.

    
por 06.04.2010 / 20:36
0

Gostaria de saber o que uma versão recente do rsync faria com um diretório vazio como a origem e a opção --delete ...

    
por 06.04.2010 / 20:45
0
find . -type f -print | awk '{ print "rm \"" $1 "\""} | sh
    
por 06.04.2010 / 20:48
0

Basta executar o rm como parte do seu comando find. Não há necessidade de tubos / xargs / impressão de fantasia.

encontre. -exec rm -f {} +

    
por 01.03.2012 / 04:42

Tags