Batch renomeia / mescla muitos diretórios

3

Isso é provavelmente muito fácil, mas qual é a melhor maneira de renomear todos os diretórios chamados "A" para "B" recursivamente abaixo de um diretório base sem seguir links simbólicos e mesclar o conteúdo de diretórios conflitantes? Ou seja, se um diretório "B" já existir, o conteúdo de "A" deve ser movido para "B" e o diretório vazio "A" será excluído.

    
por Alex Reinking 20.01.2017 / 23:27

1 resposta

0

Não existe um único programa que execute a função renomear / mesclar, embora mv ... -t ... seja útil se puder ser mais facilmente usado em um comando find . Então, o que eu planejei é:

find BaseDir/ -type d -name "A" | sort -r | while read d; \
     do [ -d "${d%A}B" ] && mv "$d"/* "${d%A}B"/ && rmdir "$d" || \
         mv "$d" "${d%A}B"; done

O que isto faz é: -

  • Localize todos os diretórios com o nome A .
  • Ordene reversa para que, por exemplo, BaseDir/A/A seja renomeado antes de BaseDir/A : se o último for renomeado primeiro, o primeiro não será encontrado posteriormente.
  • Percorra cada diretório encontrado: se B não existir, uma simples renomeação funcionará; caso contrário, os conteúdos de A serão movidos para B e o agora vazio A poderá ser removido.

Observe que, se B preexistente, todos os arquivos contidos nele serão substituídos por arquivos com o mesmo nome em A : você pode adicionar comandos extras para evitar isso - você pode usar mv -i , mas você precisará restabelecer o terminal para qualquer solicitação (por exemplo, mv </dev/stdin -i ... ou qualquer que seja o suporte do Linux), pois stdin foi redirecionado no script.

Eu usei aspas para permitir espaços em branco em qualquer um dos elementos do caminho, incluindo A e B .

Eu tentei testar diferentes hierarquias, mas não posso ter certeza de que cobri todas as estruturas que você pode usar. Eu sugiro que você coloque echo antes dos comandos mv e rmdir primeiro, até que você tenha verificado que o comando faz o que você quer.

    
por 24.01.2017 / 00:24

Tags