Uso do comando Renomear

0

Eu tenho uma pergunta em duas partes.

Eu tenho uma série de arquivos com os nomes "file.pdb. #", onde # é um inteiro.

1.) Como posso script para renomear todos os "file.pdb. #" para "file _ #. pdb", onde o inteiro é preservado? Todos os arquivos estão no mesmo diretório.

Eu, presumivelmente, preciso ler na string constante (file.pdb.) com a variável sendo a #.

2.) Ainda mais importante, como eu teria procurado essa resposta corretamente entre as perguntas respondidas? Não tenho dúvidas de que esta pergunta foi respondida muitas vezes antes. No entanto, não tenho certeza de como eu poderia ter procurado adequadamente a resposta a essa pergunta (e obviamente eu deveria aprender a pesquisar melhor as perguntas respondidas anteriormente para não incomodar as pessoas no futuro). Eu não posso imaginar o que é a string de pesquisa correta (googling como ler em arquivos e renomeá-los no Linux é muito genérico e eu passei por sugestões não pertinentes a este tipo de manipulação de formato de arquivo).

    
por Robert Molt 02.07.2015 / 05:28

3 respostas

3

Você pode usar grupos de captura e referências anteriores , por exemplo

rename -vn -- 's/\.(pdb)\.(\d+)/_$2.$1/' *.pdb.*

para corresponder a um período literal \. seguido por (literal) sequência pdb , seguido por um segundo período \. e, em seguida, uma sequência de um ou mais dígitos \d+ , copiando a sequência e a sequência de dígitos em numerados capture os grupos $1 e $2 respectivamente e, em seguida, substitua-os na ordem inversa com um sublinhado no lugar do primeiro período.

As opções -v e -n são para saída detalhada (listando as alterações feitas) e sem operação, permitindo que você teste a correção antes de confirmar qualquer substituição real: você precisará remover a n opção para realmente aplicar as alterações .

O -- marca as opções de fim de comando - isso apenas torna o comando mais robusto no caso raro de você ter nomes de arquivos que começam com um hífen.

Teste-o em um diretório contendo arquivos file.pdb.1 file.pdb.2 file.pdb.3 file.pdb.4 file.pdb.5 (entre outros):

$ rename -vn -- 's/\.(pdb)\.(\d+)/_$2.$1/' *.pdb.*
file.pdb.1 renamed as file_1.pdb
file.pdb.2 renamed as file_2.pdb
file.pdb.3 renamed as file_3.pdb
file.pdb.4 renamed as file_4.pdb
file.pdb.5 renamed as file_5.pdb
    
por steeldriver 02.07.2015 / 05:47
1

A maneira mais restrita possível, de forma que apenas os nomes de arquivos que começam com file.pdb. seguido por pelo menos um dígito sejam renomeados, usando rename :

rename -n 's/(file)(\.pdb)\.([0-9]+)/$1_$3$2/' *

Se o resultado for o esperado, remova a opção -n :

rename 's/(file)(\.pdb)\.([0-9]+)/$1_$3$2/' *
    
por kos 02.07.2015 / 05:40
1

Além das excelentes rename respostas que você já recebeu, você pode usar a expansão do parâmetro bash :

for i in *.pdb.*; do mv -i "$i" "${i%%.pdb.*}_${i##*.}.pdb"; done
  • O padrão ${i%%.pdb*} receberá a parte file do nome file.pdb.#

  • ${i##*.} receberá os dígitos depois de .pdb.

por heemayl 02.07.2015 / 16:10