como posso renomear vários arquivos removendo um caractere ou string?


21

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?


Deseja remover apenas o ras, ou seja, acabar com sw..001ou ras.sair sw.001?
Kevin

eu provavelmente gostaria de remover o 'ras.'. o comando seria muito diferente?
Paul

Não, apenas se você incluir \.os padrões.
Kevin

Respostas:


35

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.


Você poderia explicar sua resposta para outras pessoas que estão aprendendo? O que "s / ras \ .// sw.ras. *" Faz? Acho que sei, mas quero ter certeza, e outros podem aprender também. Segunda opção da mesma maneira.
H_7 3/03/12

1
@ H_7 Boa ideia, eu adicionei uma explicação.
Kevin

14

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 .


1
Essa é uma ótima ferramenta !!!
Christian

5

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:]]

1

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 -
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.