Precisa encontrar recursivamente todos os nomes de arquivos que contêm dois pontos e substituir os dois pontos por um travessão?

Precisa encontrar recursivamente todos os nomes de arquivos que contêm dois pontos e substituir os dois pontos por um travessão?

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

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

Responder1

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

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

Esta é uma versão básica segura que apenas imprime o que aconteceria. Para que isso realmente aconteça, livre-se da -nopção.

Funcionaria sem, -name "*:*"mas é bom deixar findpassar apenas os nomes dos arquivos que devem ser alterados, pois isso torna todo o comando mais rápido.

Funciona assim:

  • findencontra...
    • ...no /path/to/directorydiretório...
    • ...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 vez ( {} +).

Notas:

  • O comando não renomeia diretórios e isso ocorre 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 possui esses nomes de arquivo, então esta é uma nota bastante formal.

Nota de compatibilidade

A solução usa script Perl renamedo renamepacote disponível no Debian, Ubuntu. Outras distros podem ter renamedesde util-linux.

Este manualsugere que a solução para não-Perl renamedeveria ser:

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

(Novamente, remova -nse parecer certo.) Porém, ainda não testei isso. Acho que 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 mais dois pontos.

Alternativamente, você pode obter o script Perl de um arquivo disponível emesse site(atualmente File-Rename-0.20.tar.gz, o script é nomeado rename.PL). Veja tambémessa questão.

informação relacionada