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 -n
opção.
Funcionaria sem, -name "*:*"
mas é bom deixar find
passar apenas os nomes dos arquivos que devem ser alterados, pois isso torna todo o comando mais rápido.
Funciona assim:
find
encontra...- ...no
/path/to/directory
diretó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 (
{} +
).
- ...no
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 rename
do rename
pacote disponível no Debian, Ubuntu. Outras distros podem ter rename
desde util-linux
.
Este manualsugere que a solução para não-Perl rename
deveria ser:
find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +
(Novamente, remova -n
se 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.