Se você tiver a sorte de ter rename
disponível, o seguinte deve ser suficiente:
rename 's/(NORMAL).*(-lib)/$1X$2/' *
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.
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
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'
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
Tags rename shell shell-script