Eu tenho um grupo de arquivos que possuem :
(dois pontos) dentro do nome. Eu preciso substituir o :
com -
(traço).
Existe uma maneira fácil de fazer isso em um script?
FileName de amostra: 2013-10-11:11:52:08_055456663_045585_.txt
Um simples liner deve fazer (assume o sh
shell compatível com Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Explicação:
for ... in ...; do ...; done
é um loop
*:*
corresponde a todos os arquivos e diretórios no diretório atual que possuem :
seu nome
f
é atribuído, por sua vez, a cada um desses nomes de arquivo no loop
mv
renomeia seu primeiro argumento para o segundo; -v
(detalhado) pede que imprima o que faz; essa opção é específica do GNU-utils , portanto está disponível no Linux, mas não no Solaris
echo
imprime seu argumento na saída padrão
tr
lê a saída padrão e converte os caracteres de acordo com o mapa fornecido
Se você estiver usando o bash , poderá evitar gerar um shell extra ( $()
) com subprocessos ( tr
) substituindo $(...)
por ${f//:/-}
.
for f in
loop ... é um loop que itera sobre todos os arquivos no diretório atual em que os arquivos precisam corresponder*:*
. (O que acontece com os dirs que correspondem?). O comando move é um movimento oldname newname em que o novo nome é gerado executando um shell com$( subshell here )
. O que tr faz, ...$(echo "$f" | tr ':' '-')
com"${f//:/-}"
e evitar o subshell, canal e chamada de programa externa. Eu acho que isso é um basismo, mas eh. Veja aqui .Conforme declarado em outro post por mim, a
rename
ferramenta pode fazer o truque para você. Você só precisa digitarrename s/:/-/ <files to rename>
Isso substitui todos os dois pontos por um traço em todos os arquivos que você nomear no final, ou seja,2013-10-*
Aqui está o link para o meu outro Post
fonte
Tenho certeza que um profissional UNIX poderia fazer isso com o bash, mas aqui está minha versão rápida e suja com o ruby.
defina path_to_files como o caminho para seus arquivos com nomes incorretos. salve o código acima em um arquivo chamado rename.rb e:
fonte
Se você tiver apenas um ou alguns arquivos, poderá renomear para você:
p="201*"
.old_name=$(ls | grep $p)
.Armazene o novo nome de arquivo com as substituições de caracteres necessárias:
Limpeza de bônus :
a. Se, por uma questão de uniformidade, você deseja substituir os traços (
-
) pelos dois pontos (:
) por sublinhados (_
), você pode fazer o seguinte:b. Se você quiser que o último sublinhado (logo antes do
.txt
) seja eliminado, defina anew_name
variável como:mv $old_name $new_name
NB:
mv
falhará se algum dos nomes de arquivo na operação de renomeaçãospaces
estiver nele. Nesse caso, coloque as variáveis apropriadas entre aspas, como:mv "$old_name" $new_name
ORmv $old_name "$new_name"
ORmv "$old_name" "$new_name"
One-liners
fonte
usando renamer :
fonte
rename
é uma ferramenta pré-instalada em muitas distribuições linux. Mas acho que para o Windows essa ferramenta pode ser ótima.Isso pode ser um exagero, mas você pode renomear qualquer caractere especial com o script no link fornecido nesta resposta:
/superuser//a/858671/365691
fonte