Precisa encontrar recursivamente todos os nomes de arquivos contendo dois pontos e substituir os dois pontos por um traço?

1

Eu tenho um diretório 'main' contendo muitos subdiretórios e em alguns desses subdiretórios eu tenho nomes de arquivos que contêm dois pontos. Eu carreguei o diretório 'main' para um repositório do GitHub do Linux, mas tive problemas quando tentei extrair desse repositório em uma máquina Windows, já que o Windows não permite dois pontos em nomes de arquivos.

Como posso recursivamente encontrar todos os nomes de arquivos com dois pontos no diretório 'principal' usando o terminal do Linux e, em seguida, substituir os dois-pontos por um caractere de traço (-)?

    
por eurocoder 29.08.2017 / 07:35

1 resposta

4

find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +

(Se este comando não funcionar para você, veja a Nota de compatibilidade no final desta resposta.)

Esta é uma versão básica segura que imprime apenas o que aconteceria. Para que isso aconteça, elimine a opção -n .

Funcionaria sem -name "*:*" , mas é bom deixar que find passe apenas os nomes de arquivos que devem ser alterados porque isso torna o comando inteiro mais rápido.

Funciona assim:

  • find encontra ...
    • ... no /path/to/directory dir ...
    • ... todos os arquivos ( -type f ) ...
    • ... com nomes correspondentes ( -name "*:*" ), ...
    • ... então executa rename (várias vezes, se necessário) ...
    • ... com o padrão para substituir : por - ...
    • ... em todos os arquivos encontrados, vários arquivos de uma só vez ( {} + ).

Notas:

  • O comando não renomeia os diretórios e isso é por design.
  • A renomeação pode não funcionar com alguns caracteres incomuns no nome do arquivo (por exemplo, nova linha). Certamente você não tem esses nomes de arquivos, então esta é uma nota formal.

Nota de Compatibilidade

A solução usa o script Perl rename do pacote rename disponível no Debian, Ubuntu. Outras distros podem ter rename de util-linux .

Este manual sugere que a solução para não-Perl rename deve ser :

find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +

(Mais uma vez, remova -n se parece certo.) Eu não testei isso embora. Eu acho que irá substituir apenas os primeiros dois pontos em um nome de arquivo. Uma solução alternativa é repetir o comando (sem -n , com -v ) até que não haja dois pontos restantes.

Como alternativa, você pode obter o script Perl em um arquivo disponível em este site (atualmente File-Rename-0.20.tar.gz , o script é denominado rename.PL ). Veja também esta questão .

    
por 29.08.2017 / 08:05