Sim, existem duas variantes principais não relacionadas e completamente incompatíveis de um comando rename
em sistemas Linux.
Um perl
um (iniciado como um script de exemplo décadas atrás, foi enviado junto com perl
por um longo tempo, e você o encontra hoje em dia como um ou vários pacotes separados com algumas extensões). Esse é chamado rename
ou às vezes prename
em sistemas em que rename
é outra coisa.
Esse é o que a linha de comando está esperando.
E há um utilitário rename
muito limitado em util-linux
. Esse é às vezes chamado de rename.ul
em sistemas em que rename
é o perl
' rename
.
Com esse, você só pode substituir uma ocorrência de uma string por outra. Você poderia fazer -execdir rename : - {} +
, mas isso só substituiria dois pontos ( 12:30:00.log
- > 12-30:00.log
).
Aqui, você poderia implementar rename
manualmente:
find . -name '*:*' -type f -print0 | perl -0ne '
rename $_, s{[^/]+$}{$& =~ y/:/-/r}res or warn "rename $_: $!"'
(certificando-se de que :
s sejam substituídos por -
apenas no nome base dos arquivos, como se os diretórios contivessem :
, isso falharia).
Ou usando um shell em vez de perl
para fazer a substituição e chamar mv
para a renomeação (aqui usando bash
e o operador de expansão de parâmetro ${var//pattern/replacement}
ksh, você pode substituir bash
por ksh
ou zsh
se você não tiver bash
):
find . -name '*:*' -type f -exec bash -c '
for file do
base=${file##*/}
mv "$file" "${file%/*}/${base//:/-}"
done' bash {} +
Ou use zsh
e sua função zmv
:
autoload zmv
zmv '(**/)(*:*)(#qD.)' '$1${2//:/-}'