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?
command-line
find
rm
Scott Wilton
fonte
fonte
find -type f ! -name "[.]*" -delete
Não é adequado?-delete
- basta imprimir os nomes dos arquivos para excluir.Respostas:
Use
find
para isso:fonte
-delete
I do not want to delete hidden (dot) files.
+
(pelo menos não nas famílias Bourne, csh ou rc). Há uma lenda que diz que algumas versões antigas decsh
escape necessárias,{}
mas nunca as encontrei.find . ! -name '.*' ! -type d ! -path '*/.*'
faça o trabalho.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./
.tente algo como:
fonte
.... -exec rm {} +
?-exec rm {} +
não é paralelo, apenas chamarm
com vários nomes de arquivos. Ele executa menosrm
invocaçõ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-delete
ou-execdir rm {} \;
resolveria completamente isso.-exec
é padrão.-delete
e-execdir
vê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.