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).

Tom Brito
fonte
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

fonte
@ 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.

slm
fonte
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 {} +
Gilles 'SO- parar de ser mau'
fonte
-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.

rohit
fonte
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