Remova todos os arquivos recursivamente sem excluir diretórios

10

Eu quero "limpar" todos os arquivos de um diretório, incluindo todos os arquivos em subdiretórios, mas quero deixar os subdiretórios no lugar. Meu entendimento rm -ré que ele também excluirá os próprios subdiretórios.

Eu não deseja excluir arquivos ocultos (ponto).

Como isso pode ser feito?

Scott Wilton
fonte
1
find -type f ! -name "[.]*" -deleteNão é adequado?
Costas
Eu não sei. Isso faz o que estou pedindo?
Scott Wilton
Tente sem -delete- basta imprimir os nomes dos arquivos para excluir.
Costas
Deseja excluir arquivos (ocultos ou não) em diretórios ocultos?
Stéphane Chazelas
E quanto aos links simbólicos para diretórios?
Stéphane Chazelas

Respostas:

10

Use findpara isso:

find . ! -name '.*' ! -type d -exec rm -- {} +
jimmij
fonte
1
Nem todas as implementações de localização têm-delete
wurtel
3
@RomeoNinov, por favor, leia a pergunta OP:I do not want to delete hidden (dot) files.
jimmij
1
@ Costas, não, não há shell que exija escape +(pelo menos não nas famílias Bourne, csh ou rc). Há uma lenda que diz que algumas versões antigas de cshescape necessárias, {}mas nunca as encontrei.
Stéphane Chazelas
1
@ScottWilton Diretórios ocultos estão incluídos, mas arquivos ocultos em diretórios ocultos não. Se você deseja rejeitar todos os arquivos em diretórios ocultos, find . ! -name '.*' ! -type d ! -path '*/.*'faça o trabalho.
jimmij
1
@ Jimmy, mais gostaria find . -name '.?*' -prune -o ! -type d -exec rm {} +de evitar descer naqueles completamente. Observe que --não é necessário aqui (mas não faz mal), pois os caminhos começam com ./.
Stéphane Chazelas 31/01
0

tente algo como:

find <path> ! -name '.*' -type f -exec rm {} \;
Romeo Ninov
fonte
Qualquer razão para remover os arquivos um de cada vez, em vez de acelerar as coisas .... -exec rm {} + ?
Anthon
Eu prefiro fazer as coisas uma por uma. Massa (e paralelos) operações têm algum estranho (e desagradáveis) efeitos colaterais de tempo (como make enorme carga sobre o I / O subsistema)
Romeo Ninov
1
-exec rm {} +não é paralelo, apenas chama rmcom vários nomes de arquivos. Ele executa menos rminvocações e, portanto, facilita a utilização de recursos. Se for um pouco menos seguro, pois aumenta a janela de corrida na qual um componente de diretório dos arquivos a serem removidos pode ser alterado para um link simbólico. Mas apenas -deleteou -execdir rm {} \;resolveria completamente isso.
Stéphane Chazelas
@ StéphaneChazelas, nenhum deles (-delete ou -execdir) existe no UNIX. E eu não vejo em questão a ser mencionado linux!
Romeo Ninov 31/01
@ RomeoNinov, sim, eu disse em outro comentário aqui que só -execé padrão. -deletee -execdirvêm de BSDs, o GNU os adicionou cerca de 10 anos depois. De qualquer forma, isso não tem nada a ver com o Linux, que é apenas um kernel.
Stéphane Chazelas