Alguém pode sugerir sobre como renomear o nome do arquivo:
head.body.date.txt
Para:
head_body_date.txt
Existe uma declaração de linha única para renomear no Unix ?
Alguém pode sugerir sobre como renomear o nome do arquivo:
head.body.date.txt
Para:
head_body_date.txt
Existe uma declaração de linha única para renomear no Unix ?
.tar.gz
é uma extensão? Além disso, seja bem-vindo à U&L!mv head.body.date.txt head_body_date.txt
. Se você tiver outras restrições ou exemplos reais, atualize sua pergunta com estes. Como está agora, não está claro se a pergunta se refere a um arquivo com esse nome explícito, um único diretório em que todos os arquivos têm um formato específico ou se você deseja pesquisar na hierarquia de diretórios por nomes específicos e alterá-los.Respostas:
Itere sobre os nomes de arquivos e use a expansão Parameter para a conversão:
O padrão de expansão do parâmetro
${f//./_}
substitui todos os.
s por_
s no nome do arquivo ($f
).O procedimento acima será executado a seco, para permitir que a renomeação real ocorra, remova
echo
:Se você deseja lidar com qualquer extensão, não apenas
.txt
:Após verificar remover
echo
para ação real:Genérico, para número arbitrário de pontos, pelo menos um:
fonte
for f in *.*; do ...; done
*.*
padrão seja reto no exemplo, já que agora o código parece funcionar apenas com um número fixo de pontos.com
perl
baserename
\.[^.]+$(*SKIP)(*F)
pule esse padrão e procure correspondências alternativas|\./_/g
substitua tudo.
por_
Ou, usando lookahead negativo
Quando estiver tudo bem, remova a
-n
opçãofonte
Usa a substituição de regex para localizar tudo, exceto a última instância do
.
nome do arquivo (lookahead que não captura) e substituí-los por_
. Generaliza*.*
se quiser.(esta versão específica do
rename
parece estar instalada viautil-linux
). Estou usandoUbuntu 12.04
(sim, máquina severamente desatualizada).fonte
bash
:fonte
mv --
para se proteger contra nomes de arquivos “antigos” que começam com-
. (2) Você deve colocar$old
aspas ("$old"
), para se proteger contra nomes de arquivos “antigos” que contêm espaços ou caracteres especiais para o shell (como*
e?
). (3) Sua resposta falha no caso um tanto patológico em que a extensão contém um sublinhado:head.body.date.t_xt
é renomeada parahead_body_date_t.xt
.Usando
mv
,sed
erev
em uma linha:Se você deseja aplicá-lo em todos os
txt
arquivos no representante atual, o uso de globs parece complicado por causa de comomv
funciona, mas você pode fazer umfor
loop em uma linha:Um pouco mais, mas você pode combinar vários padrões no seu loop!
fonte
$(ls …)
; apenas façafor file in *.txt
. (2) Você deve usar mais citações:mv "$file" "$(…)"
.rename
como vários outros sugeriram em suas respostas faz som mais simples embora ...É tão simples quanto isso para um único arquivo de cada vez. Você não especifica se deseja que isso seja feito recursivamente em um diretório ou em todo o diretório, para que essa seja a solução mais conveniente e rápida.
fonte