Renomeando vários arquivos com renomeação

5

Eu preciso renomear arquivos em lote - as outras perguntas que eu consultei não correspondem exatamente ao meu problema. Os nomes dos meus arquivos são gerados não deterministicamente, então não posso prever o que eles serão nomeados. Eu sei que eles começarão com NORMAL e terminarão com -lib* . Gostaria de substituir tudo entre uma string X . Por exemplo,

|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.concordant
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.deletion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.divergent
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.inversion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.translocation
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.concordant
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.deletion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.divergent
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translocation

Por isso, provavelmente estará no formato rename "s/something/X/" , mas não sei o que deve ser esse algo, pois não sei como usar o regex.

    
por goodcow 01.08.2014 / 17:19

4 respostas

1

Se você tiver a sorte de ter rename disponível, o seguinte deve ser suficiente:

rename 's/(NORMAL).*(-lib)/$1X$2/' *
    
por 01.08.2014 / 21:04
2

O% útil perl suportado por rename nem sempre está disponível em todas as distros. Por exemplo, o Fedora e o CentOS (e presumivelmente o RedHat) usam um utilitário básico rename que faz pesquisa e substituição básica e nada mais.

Se você tiver a infelicidade de usar um deles, algo como o seguinte pode ajudar:

for oldname in *; do
    newname=$(echo "$oldname" | sed -e 's/\(NORMAL\).*\(-lib.*\)/X/')
    mv "$oldname" "$newname"
done
    
por 01.08.2014 / 20:27
1

Existem dois programas não relacionados chamados rename . O encontrado no Debian e derivados (Ubuntu, Mint,…) é um script Perl, e seu primeiro argumento é uma expressão Perl que transforma o nome antigo no novo nome. Com esse script, você pode fazer

rename 's/.*-lib/NORMAL_X-lib/' NORMAL_*-lib*

O % operadors executa um substituição de expressão regular . Existem muitos tutoriais de expressões regulares na Web, por ex. 1 . .*-lib corresponde a string até a última ocorrência de -lib ( .* corresponde a qualquer string), então s/.*-lib/NORMAL_X-lib/ substitui a parte NORMAL_blahblah-lib por NORMAL_X-lib .

Se você tem uma distribuição Linux que não é derivada do Debian, então o utilitário rename é adequado para quase nenhuma tarefa prática. Você pode usar um loop de shell.

for x in NORMAL_*-lib*; do
  mv "$x" "NORMAL_X-lib${x##*-lib}"
done

${x##*-lib} é o valor da variável x menos a parte até a última ocorrência de -lib . Esta é a sintaxe de expansão de parâmetros padrão.

Esta tarefa é mais fácil em zsh, com sua função zmv . Coloque autoload -U zmv no seu .zshrc (ou execute-o na linha de comando por uma vez) e, em seguida, execute

zmv 'NORMAL_*-(lib*)' 'NORMAL_X-$1'
    
por 02.08.2014 / 01:16
0

Você pode considerar o uso de lookarounds , como (?<=NORMAL).*?(?=-lib) , por exemplo,

$ rename -v -n -- 's/(?<=NORMAL).*?(?=-lib)/X/' *
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion renamed as NORMALX-lib4.insertion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion renamed as NORMALX-lib4.inversion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translation renamed as NORMALX-lib4.translation
    
por 01.08.2014 / 18:16