Sei que a pergunta dele não pediu, mas nunca me lembro: seu exemplo lida com nomes de arquivos com espaços?
Grundlefleck
4
Sim, é para isso que servem print0 e -0 a xargs. Normalmente, ele não manipula os espaços corretamente, no entanto, com print0, ele imprime o nome do arquivo com um caractere nulo no final da linha, que o xarg com -0 utilizará para passar o caminho completo para xargs sem a chance de ter o espaço em branco. sendo usado um segundo ou terceiro parâmetro para o comando rm, o que pode ser muito ruim!
X-Istence
7
@X: o findutils mais recente suporta uma -deleteação que pode encurtar isso. @JT: Isso pesquisa recursivamente em .. Depende de quantos arquivos e subdiretórios existem ... você não pode simplesmente proibir os uploads?
ephemient
1
Usando a -rbandeira (recursivo) não é recomendado neste caso, desde que você não deseja excluir qualquer diretório ..
Daniel Zohar
2
@IlmariKaronen: bom ponto. Não command rmseria uma solução melhor (ou seja, mais direta)? (Por "direto", quero dizer que lida especificamente com o problema em questão e nada mais, e, portanto, é menos provável que tenha efeitos colaterais indesejados e também será mais auto-explicativo para quem precisar manter o código
Adicionar -printpara também obter uma lista de exclusões.
O comando funcionará para você se você tiver um sistema POSIX atualizado, acredito. Pelo menos, funciona para mim no OS X 10.8 e funciona para outras pessoas que o testaram no macOS 10.12 (Mojave).
Os nossos agradecimentos a @ephemient em um comentário na postagem de @ X-Istence (consideramos útil o suficiente para justificar sua própria resposta).
@OneOfOne: como diz o meu comentário, consegui isso no @ ephemient. Como iniciante, achei sua solução (talvez mais correta) muito menos legível e utilizável. Eles podem ser funcionalmente idênticos, mas acho que essa sintaxe fornece mais clareza.
rattray
1
O '.' não é necessário porque findrecursa no diretório de trabalho atual por padrão.
Tom Russell
Nas versões mais recentes do programa, o diretório pode ser omitido e implicará no diretório de trabalho atual ( wikipedia ). Você ainda precisa .do macOS 10.12 (Sierra).
Isso funciona muito bem. Mas uma palavra de cautela, eu apenas usei esse rm -i achado ./ -name '* py'` -rf , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`). Graças a Deus pelo meu script de backup.
Ryanjdillon
1
Se houver muitos arquivos, isso interrompe o erro:-bash: /bin/rm: Argument list too long
Viktor
12
cd /var/www/html && find .-name '.DS_Store'-print0 | xargs -0 rm
cd /var/www/html && find .-name '._*'-print0 | xargs -0 rm
O Zsh tem muitos outros recursos que faltam para o bash, mas só esse vale a pena fazer a troca. Está disponível na maioria das distribuições (provavelmente todas) do Linux, assim como no cygwin e no OS X.
Você pode encontrar mais informações no site zsh .
Um possível problema: como você não usa xargs, você pode encontrar a restrição de comprimento do argumento da linha de comando. Além disso, Bash 4 suportes **também :-) (embora não por padrão, shopt -s globstarprecisa ser definido)
O uso de exec para cada arquivo encontrado não é rápido. É mais rápido encontrar os impressos e, em seguida, usar xargs para chamar o rm uma vez.
X-Istence
3
No entanto, se você tiver um findque o suporte, +é semelhante ao xargs: find . -name "FILE-TO-FIND" -exec rm -rf {} +- (também, você está perdendo um espaço antes -exec)
Pausado até novo aviso.
3
nós nunca tivemos xargs no meu dia. E nós tivemos que caminhar até a escola, subida ambas as maneiras .......
Martin Beckett
3
Exemplo para excluir "Thumbs.db" recursivamente;
find .-iname "Thumbs.db"-print0 | xargs -0 rm -rf
Validar por:
find .-iname "Thumbs.db"
Agora, isso não deve exibir nenhuma das entradas com "Thumbs.db", dentro do caminho atual.
Certifique-se de que sua resposta imprima uma lista do que está sendo excluído e explique por que alguém pode querer usar xargse em print0vez de exec(existem motivos).
Josh Habdas 21/03/19
3
É melhor ver o que está removendo adicionando -print a esta resposta
Respostas:
mude para o diretório e use:
Não testado, experimente-os sem o xargs primeiro!
Você pode substituir o período após a localização, pelo diretório, em vez de mudar para o diretório primeiro.
fonte
-delete
ação que pode encurtar isso. @JT: Isso pesquisa recursivamente em.
. Depende de quantos arquivos e subdiretórios existem ... você não pode simplesmente proibir os uploads?-r
bandeira (recursivo) não é recomendado neste caso, desde que você não deseja excluir qualquer diretório ..command rm
seria uma solução melhor (ou seja, mais direta)? (Por "direto", quero dizer que lida especificamente com o problema em questão e nada mais, e, portanto, é menos provável que tenha efeitos colaterais indesejados e também será mais auto-explicativo para quem precisar manter o códigofonte
Os novos findutils suportam
-delete
, então:Adicionar
-print
para também obter uma lista de exclusões.O comando funcionará para você se você tiver um sistema POSIX atualizado, acredito. Pelo menos, funciona para mim no OS X 10.8 e funciona para outras pessoas que o testaram no macOS 10.12 (Mojave).
Os nossos agradecimentos a @ephemient em um comentário na postagem de @ X-Istence (consideramos útil o suficiente para justificar sua própria resposta).
fonte
find
recursa no diretório de trabalho atual por padrão..
do macOS 10.12 (Sierra).Comando simples:
Boa sorte!
fonte
rm -i
achado ./ -name '* py'` -rf, which did NOT prompt me to delete files. you will need to take it on the end (i.e.
-rfi`). Graças a Deus pelo meu script de backup.-bash: /bin/rm: Argument list too long
fonte
Você pode mudar para zsh em vez de bash. Isso permite usar ** para corresponder arquivos em qualquer lugar da árvore de diretórios:
Você também pode combiná-los assim:
O Zsh tem muitos outros recursos que faltam para o bash, mas só esse vale a pena fazer a troca. Está disponível na maioria das distribuições (provavelmente todas) do Linux, assim como no cygwin e no OS X.
Você pode encontrar mais informações no site zsh .
fonte
**
também :-) (embora não por padrão,shopt -s globstar
precisa ser definido)fonte
find
que o suporte,+
é semelhante ao xargs:find . -name "FILE-TO-FIND" -exec rm -rf {} +
- (também, você está perdendo um espaço antes-exec
)Exemplo para excluir "Thumbs.db" recursivamente;
Validar por:
Agora, isso não deve exibir nenhuma das entradas com "Thumbs.db", dentro do caminho atual.
fonte
xargs
e emprint0
vez deexec
(existem motivos).É melhor ver o que está removendo adicionando -print a esta resposta
fonte
se você tiver o Bash 4.0 ++
fonte
Algumas coisas a serem observadas:
'-delete' não é recursivo. Portanto, se .TemporaryItems (folder) tiver arquivos, o comando falhará.
Existem muitos desses arquivos irritantes criados por macs: .DS_Store ._. DS_Store .TemporaryItems .apdisk
Este comando aborda todos eles. Evita a execução de encontrar repetidas vezes para várias correspondências.
fonte
Isso também funciona:
sudo rm -rf 2018-03-*
aqui seus arquivos são excluídos com nomes do formato 2018-03- (outra coisa)
mantenha simples
fonte
sudo
nem fornece informações sobre comorm
funciona no contexto da sua resposta.