Eu tenho um diretório com algumas centenas de milhares de arquivos.
Quero excluir todos os arquivos, mas rm * -f reporta: "a lista de argumentos é muito longa"
Qual é a melhor maneira de limpar este diretório?
Eu tenho um diretório com algumas centenas de milhares de arquivos.
Quero excluir todos os arquivos, mas rm * -f reporta: "a lista de argumentos é muito longa"
Qual é a melhor maneira de limpar este diretório?
Respostas:
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).
find dir/to/delete -delete
(não gera um rm
processo por arquivo a ser excluído).
find dir/to/delete -type f -delete
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.
ionice
pouco antes rm
é uma boa ideia se o computador for usado por outras pessoas ao mesmo tempo.
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.
find . -print0 | xargs -0 rm
).
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]
").
Consegui fazer isso fazendo backup de um nível:
cd ..
E correndo:
rm directory name -rf
E, em seguida, recrie o diretório.
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.
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
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