Como apagar todos os diretórios dentro de um diretório, exceto arquivos (com segurança)?

0

Ambiente

Sistema: Linux Mint 19 Canela.

Shell: Bash versão 4.4.19 (1).

Problema

Junto com centenas de cenários de teste, devo ter criado inúmeros diretórios de instalação temporários com arquivos como conteúdo, que preciso excluir toda vez manualmente. Parece assim:

$ ls --group-directories-first --classify

test1/  test2/  testA/  testFin/  decrypt-file-aes256*  encrypt-file-aes256*  Makefile  openssl-encryption.tar.xz  openssl-encryption.tar.xz.asc  SHA512SUM

Eu quero automatizar este processo de limpeza.

Progresso

Descobri que o comando find pode ser muito útil, por exemplo:

find . -maxdepth 1 -type d -exec rm -rf {} +

Isso, nos meus testes iniciais do terminal, mostrou estar funcionando, mas antes de colocá-lo no meu Makefile, alvo limpo, quero perguntar se há alguma medida de segurança que eu deva levar em conta?

Esse exemplo, no entanto, produz um pequeno erro:

rm: refusing to remove '.' or '..' directory: skipping '.'

Como proceder para ser mais específico aqui?

Alvo de Makefile 'limpo' corrigido atual

clean:

    @echo; tput bold; tput setaf 3; echo Target: $@; tput sgr0; echo

    @if [ $$(id --user) -eq 0 ]; then \
        tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run as normal user!"; tput sgr0; echo; exit 1; \
    fi

    @if [ ! -f .safeclean-$(distrib_name) ]; then \
        tput bold; tput setaf 1; echo "ERROR: Target '$@' has to be run from within its Makefile's directory!"; tput sgr0; echo; exit 1; \
    fi

    @ls -l | grep '^d' > /dev/null || echo "There are no more directories."

    @for dir in *; do \
        if [ -d "$$dir" ]; then rm --force --recursive --verbose "$$dir"; fi \
    done

    @rm --force --verbose $(distrib_name).tar.xz $(distrib_name).tar.xz.asc

    @echo; tput bold; tput setaf 2; echo "Ok. Directory clean successful."; tput sgr0

Exemplo de saída (visual)

    
por Vlastimil 14.10.2018 / 18:27

1 resposta

2

Antes de mais nada, tenha cuidado extra antes de fazer find + rm em um Makefile.

Tendo dito isso, você pode achar mais fácil fazer o script:

myclean:
        test -f .safefile && \
        for fn in * ; do \
                test -d "$$fn" && rm -rf "$$fn" ; \
        done

Onde .safefile é um arquivo que deve existir em seu diretório de nível superior. Isso garantirá que você não execute isso de um local diferente por engano.

O benefício adicional é que você também pode adicionar lógica a ele quando precisar.

    
por 14.10.2018 / 20:11