Como excluir apenas arquivos, mas manter a estrutura de diretórios?


16

Gostaria de excluir todos os arquivos, mas mantenha a estrutura da pasta. Há algum jeito?

NOTA: (Estou usando o GNU bash 4.1.5).


11
Como exatamente você pretende "excluir"? Você está usando algum tipo de comando? Em caso afirmativo, atualize sua pergunta para incluir isso.
— slm


Eu acho que você quer dizer excluir todos os arquivos.
— slm

11
@slm Atualizei com o comando que normalmente uso para excluir arquivos.
— Tom Brito

Não, você não tem :-) Ou, se você fez, você removido-lo novamente
— MAWG diz Reintegrar Monica

Respostas:


17

Tente o seguinte:

find . ! -type d -exec rm '{}' \;

Isso excluirá todos os arquivos, excluindo diretórios, abaixo do diretório de trabalho atual. Seja extremamente cuidadoso com este comando.

Se a versão da findsua máquina suportar, você também poderá usar

find . ! -type d -delete

@ SLM: Eu não tenho certeza de como isso é portátil. Eu o adicionei como uma opção secundária. Acabei de perceber que minha edição tornava minha resposta praticamente idêntica à sua. Me desculpe por isso; não era minha intenção.

O '{}' protege contra espaços nos arquivos? Vejo você usando o tempo todo e acho que nunca o tinha visto antes de ver você postando soluções com ele.
— slm

Na página de manual do GNU find: "Observe que os chavetas estão entre aspas simples para protegê-los da interpretação como pontuação do script de shell". Não tenho certeza quando é necessário. Eu geralmente faço isso por hábito. O findcomando nunca vê as aspas. Apenas vê o {}marcador como um argumento.

Vejo isso no exemplo, mas os modelos mostram isso, " -exec command {} +" & this " -exec command ;". Eu usei o \;no passado apenas nunca o '{}'.
— slm

@ slm: Os modelos também não mostram o escape do ponto-e-vírgula, o que geralmente é necessário ao usar um shell para executar find. Eu acho que os modelos servem para mostrar quais argumentos o findcomando precisa e não se preocupar com nada relacionado ao shell.

7

Você pode usar o comando findpara localizar todos os arquivos, mas manter a estrutura de diretórios:

$ find /some/dir -type f -exec rm {} +

De acordo com as perguntas e respostas sobre Unix e Linux, intitulado: gnu find and masking the {} for some shells - what? , escapar do {}tique único ( ') não parece mais ser necessário nas conchas modernas, como o Bash.


1

A maneira mais fácil de excluir todos os arquivos regulares do diretório e subdiretórios atuais recursivamente:

zsh -c 'rm **/*(.)'

Somente o zsh tem qualificadores de globbing para combinar arquivos por tipo. No entanto, o rmcomando não funciona em diretórios; portanto, no bash, você pode usar

shopt -s globstar
rm **/*

Isso não funciona para outros comandos que rmnão sejam . Em geral, você pode usar find:

find . -type f -delete

ou se o seu findnão suportar -delete:

find . -type f -exec rm {} +

-2

Eu tinha requisitos semelhantes para excluir arquivos de um caminho e seus subdiretórios (filtragem por tempo) sem excluir a estrutura de diretórios.

E eu usei o formato abaixo, que funcionou para mim.

encontre / test123 / home / arquivo_de_teste_de_teste / data / nfs -mtime +6 -type f -exec rm {} \;

Syntex: find (caminho do arquivo) -mtime (maior ou menor que dias) -tipo f -exec rm {} \;

-type: Mencione o tipo de arquivo "f" para o diretório "d" -exec: execute o comando rm: remove {}: saída do comando find

Nota: Teste-o antes de usá-lo. Por favor, sinta-se livre para corrigir ou atualizar se eu perdi alguma coisa.


11
como esse é um requisito adicional que não foi mencionado pelo OP e como a find ... rmestrutura básica já foi abordada, não tenho certeza de que seja uma contribuição valiosa como uma nova resposta a essa pergunta.
— Jeff Schaller
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.