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

18

Como acompanhamento do meu pergunta anterior , se eu tiver vários arquivos no formulário

sw.ras.001
sw.ras.002
sw.ras.003
…

Qual comando posso usar para remover o ras. no meio de todos os arquivos?

    
por Paul 02.03.2012 / 20:53

4 respostas

28

Você pode fazer isso com uma pequena modificação 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 script perl que usa uma expressão regular perl e uma lista de arquivos, aplica o regex ao nome de cada arquivo e renomeia cada arquivo para o resultado da aplicação da expressão regular. No nosso caso, ras é correspondido literalmente e \. corresponde a um literal . (como . sozinho indica qualquer caractere que não seja uma nova linha) e substitui isso por nada.

O loop for pega todos os arquivos que começam com sw.ras. (padrão shell glob) e faz um loop sobre eles. ${var/search/replace} pesquisa $var para search e substitui a primeira ocorrência por replace , por isso ${file/ras./} retorna $file com o primeiro ras. removido. O comando renomeia o arquivo para o mesmo nome menos ras. . Observe que com essa pesquisa e substituição, . é considerado literalmente, não como um caractere especial.

    
por 02.03.2012 / 21:18
11

Outra opção é usar mmv (Mass MoVe e renomear):

mmv '*ras.*' '#1#2'

Não se esqueça de usar as 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 .

    
por 20.10.2015 / 14:03
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:]]
    
por 02.03.2012 / 21:14
0

Recentemente tive que fazer uma renomeação em massa de vários arquivos em que tive que substituir a última ocorrência de um caractere em que o caractere ocorreu várias vezes nos nomes de arquivo. Neste caso em particular eu tive que substituir o último traço - com um sublinhado _ , transformando isto:

some-long-file-name.ext

para isso:

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 -
por 11.01.2018 / 00:56

Tags