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.
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.
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
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.
-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
Respostas:
No caso de você não poder remover o diretório, sempre poderá usar o find.
Isso excluirá todos os arquivos no diretório atual e somente o diretório atual (não os subdiretórios).
fonte
find dir/to/delete -delete
(não gera umrm
processo por arquivo a ser excluído).find dir/to/delete -type f -delete
simplesmente leva muito tempo (um exec de rm por arquivo).
este é muito mais eficiente:
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.
fonte
ionice
pouco antesrm
é 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 .
ou
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.
fonte
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.
fonte
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.
fonte
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.fonte
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
fonte
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
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
fonte