Como acompanhamento da minha pergunta anterior , se eu tiver vários arquivos do formulário
sw.ras.001
sw.ras.002
sw.ras.003
…
Que comando posso usar para remover ras.
o meio de todos os arquivos?
\.
os padrões.
Como acompanhamento da minha pergunta anterior , se eu tiver vários arquivos do formulário
sw.ras.001
sw.ras.002
sw.ras.003
…
Que comando posso usar para remover ras.
o meio de todos os arquivos?
\.
os padrões.
Respostas:
Você pode fazer isso com uma modificação bastante pequena de uma das respostas da última pergunta:
rename s/ras\.// sw.ras.*
ou
for file in sw.ras.*; do
mv "$file" "${file/ras./}"
done
Explicação:
rename
é um perl
script que utiliza uma perl
expressão regular e uma lista de arquivos, aplica a regex ao nome de cada arquivo e renomeia cada arquivo ao resultado da aplicação da regex. No nosso caso, ras
corresponde literalmente e \.
corresponde a um literal .
(já que .
sozinho indica qualquer caractere que não seja uma nova linha) e o substitui por nada.
O for
loop pega todos os arquivos que começam com sw.ras.
(shell shell padrão) e os fazem um loop sobre eles. ${var/search/replace}
pesquisas $var
para search
e substitui a primeira ocorrência com replace
, então ${file/ras./}
retorna $file
com o primeiro ras.
removidos. O comando renomeia o arquivo com o mesmo nome menos ras.
. Observe que, com essa pesquisa e substituição, .
é interpretado literalmente, não como um caractere especial.
Outra opção é usar mmv (MoVe em massa e renomear):
mmv '*ras.*' '#1#2'
Não se esqueça de usar aspas simples em torno de seus padrões, caso contrário, as estrelas serão expandidas no nível do shell.
O utilitário nem sempre está disponível, mas se não estiver, você pode instalá-lo com:
sudo apt-get install mmv
Veja a página de manual aqui .
Em qualquer shell compatível com POSIX ( bash
, dash
, ksh
, etc):
for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
mv "${file}" "${file/ras\./}"
done
Ou com rename
:
rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]
Recentemente, tive que fazer uma renomeação em massa de vários arquivos em que precisei substituir a última ocorrência de um caractere em que o caractere ocorreu várias vezes nos nomes de arquivos. Nesse caso em particular, tive que substituir o último traço -
por um sublinhado _
, transformando isso:
some-long-file-name.ext
nisso:
some-long-file_name.ext
Demorou algum tempo, mas isso finalmente aconteceu:
for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done
Aqui:
${i%-*}
corresponde ao início do nome do arquivo até a última ocorrência do traço -
${file##*-}
corresponde ao restante do nome do arquivo após a última ocorrência do traço -
ras
, ou seja, acabar comsw..001
ouras.
sairsw.001
?