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 perlscript que utiliza uma perlexpressã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, rascorresponde 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 forloop 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 $varpara searche substitui a primeira ocorrência com replace, então ${file/ras./}retorna $filecom 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..001ouras.sairsw.001?