excluir pastas com o mesmo nome que as pastas pai de forma recursiva no bash?

0

Algumas cópias de arquivos falharam em uma de minhas máquinas e estou perdendo uma quantidade ridícula de espaço ao ter uma cópia de cada pasta dentro do pai com o mesmo nome, e quero excluí-las todas.

Exemplo:

 /mnt/test/files/foo
 \_ /mnt/test/files/foo/file1 (etc)
 |__ /mnt/test/files/foo/foo
 \_ /mnt/test/files/foo/foo/file1 (etc)
 |_ /mnt/files/foo/foo2
  \_ /mnt/files/foo/foo2/file1 (etc)
 |_ /mnt/files/foo/foo2/foo2
  \_ /mnt/files/foo/foo2/foo2/file1 (etc)

Então, obviamente, eu quero excluir /mnt/files/foo/foo , /mnt/files/foo/foo2/foo2 e seu conteúdo (e assim por diante) completamente e parar de perder espaço. Qual seria uma boa maneira de fazer script no bash?

    
por Webodan 19.11.2018 / 13:53

2 respostas

2

Se o seu find suportar o predicado -regex , você poderá listar os diretórios com:

find . -type d -regex '.*/\([^/]*\)/' -prune -print

para removê-los, você pode alterar -print para:

-exec rm -rf {} +

Mas não se esqueça de verificar a lista primeiro para não excluir nenhum arquivo necessário.

    
por 19.11.2018 / 14:05
0

Usando o não-GNU find (mas ainda alguma implementação que suporta -mindepth , como find em sistemas BSD):

find top-dir -depth -mindepth 1 -type d -exec sh -c '
    for pathname do
        subdir=$pathname/${pathname##*/}
        if [ -d "$subdir" ]; then
            printf "Would remove directory %s\n" "$subdir"
            # rm -rfi "$subdir"
        fi
    done' sh {} +

Isso faria uma travessia em profundidade da hierarquia de diretórios com raiz em top-dir . Para lotes de nomes de diretórios encontrados, um script de shell curto seria chamado. Em cada iteração do loop no shell script curto, o nome do caminho de um subdiretório dentro do diretório $pathname que possui o mesmo nome do próprio diretório é construído. Se esse subdiretório existir, será relatado (a exclusão está sendo comentada para segurança).

A opção -depth faz um percurso em profundidade primeiro. Geralmente, isso é o que você deseja quando exclui diretórios com find , pois find tentaria potencialmente entrar em diretórios que você já excluiu.

A opção -mindepth 1 garante que o diretório principal não seja excluído, já que você usaria . como o caminho de pesquisa inicial.

Relacionados:

por 28.12.2018 / 16:26