Preciso excluir todas as pastas dentro de uma pasta usando um script diário. A pasta para esse dia precisa ser deixada.
A pasta 'minhapasta' tem 3 subpastas: 'teste1', 'teste2' e 'teste3', preciso excluir todas, exceto 'teste2'.
Estou tentando corresponder ao nome exato aqui:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
OU
find /home/myfolder -type d ! -name 'test2' -delete
Este comando sempre tenta excluir a pasta principal 'myfolder' também! Há alguma maneira de evitar isto ?
Isso excluirá todas as pastas dentro
./myfolder
, exceto que./myfolder/test2
e todo o seu conteúdo será preservado:Como funciona
find
inicia um comando find../myfolder
diz ao find para começar com o diretório./myfolder
e seu conteúdo.-mindepth 1
não para corresponder a./myfolder
si mesmo, apenas aos arquivos e diretórios abaixo dele.! -regex '^./myfolder/test2\(/.*\)?'
diz ao find para excluir (!
) qualquer arquivo ou diretório correspondente à expressão regular^./myfolder/test2\(/.*\)?
.^
corresponde ao início do nome do caminho. A expressão(/.*\)?
corresponde a (a) uma barra seguida por qualquer coisa ou (b) nada.-delete
diz ao find para deletar os arquivos correspondentes (ou seja, não excluídos).Exemplo
Considere uma estrutura de diretórios semelhante a;
Podemos executar o comando find (sem
-delete
) para ver o que corresponde:Podemos verificar que funcionou olhando os arquivos que restam:
Usando bash :
Exemplo:
tl;dr
Remova echo se estiver satisfeito com a lista de arquivos.
O uso
-mindepth 1
garantirá que o diretório superior não seja selecionado.Mas a não
-not -name test2
evitará subdiretórios dentro de :test2
Para fazer isso, você precisa de algo como ameixa:
Mas não use
delete
, pois isso implicadepth
e isso começará a apagar do caminho mais longo:Use
rm -rf
(removaecho
se quiser realmente apagar):Ou use também
maxdepth
se tudo o que você precisa é excluir diretórios (e tudo dentro) (removaecho
para realmente apagar):A
-delete
ainda falhará se o diretório não estiver vazio:Se você estiver usando o zsh, poderá:
^foo
é um glob que significa tudo, excetofoo
, e(/)
é um qualificador de glob que diz que o glob deve corresponder apenas aos diretórios.Se o requisito for apenas para o nível um (não mais que a profundidade 1), conforme mencionado na pergunta, aqui está outra opção fácil:
Detalhes:
ls myfolder/
lista todas as pastas e arquivos dentromyfolder/
do diretóriogrep -v "test2"
corresponde a tudo, exceto "test2"xargs rm -r
canaliza a saída do comando anterior para orm -r
comando.Testei com o comando abaixo e funcionou bem