Usando renomear para remover '.orig' do arquivo e adicionar '_1' ao nome base

1

Estou usando um script para fazer backups de arquivos e para evitar a substituição de arquivos que usei cp --backup . O que me deixa com vários arquivos que parecem example.mov.orig e test.mov.orig . Eu não consigo descobrir expressões regulares, e queria saber se alguém sabe de uma maneira de cortar o .orig e acrescentar _1 ao nome base usando renomear.

Essencialmente, o resultado que estou procurando é o comando que mudaria example.mov.orig para se tornar example_1.mov que eu poderia usar em conjunto com find /example/ -name *.*.orig

A saída de rename --version é util-linux-ng 2.18

    
por Richard Good 20.10.2015 / 13:46

2 respostas

2

O comando rename que você precisa é:

  • Se você estiver usando rename de util-linux :

    rename . _1. *.orig && rename .orig '' *.orig
    

    O primeiro substituirá a primeira ocorrência de . por _1. de todos os arquivos terminados em .orig . O segundo removerá o .orig dos nomes dos arquivos.

  • Se você estiver usando perl-rename (padrão em sistemas baseados em Debian), as coisas são mais simples, já que usa expressões regulares compatíveis com Perl, portanto, pode fazer tudo em uma única etapa:

    rename 's/(\..*)\.orig/_1$1/' *orig
    

    Como esta versão usa O regex corresponderá ao primeiro . ( \. , o . precisa ser escapado, pois ti significa "qualquer caractere" que não tenha escapado), então tudo ( .* ) até% código%. Como o primeiro padrão está entre parênteses, ele é "capturado" e pode, posteriormente, ser chamado de .orig . Portanto, a substituição substituirá qualquer coisa correspondente anteriormente por um $1 e o padrão capturado (a primeira extensão) e removerá simultaneamente o _1 .

Você pode combinar os comandos com .orig da seguinte forma:

find /example -name '*.orig' -exec rename . _1. {} +
find /example -name '*.orig' -exec rename .orig '' {} +

Ou:

find /example -name '*.orig' -exec rename 's/(\..*)\.orig/_1$1/'

Você nem precisa de find para isso. Se todos os seus arquivos estiverem no mesmo diretório, você pode usar os comandos acima diretamente, ou, para torná-lo recursivo (supondo que você esteja usando o bash):

shopt -s globstar                               ## make ** recurse into subdirectories
rename.ul . _1. **.orig && rename.ul .orig '' **.orig  ## util-linux
rename  's/(\..*)\.orig/_1$1/' **orig                  ## perl rename

Na verdade, estritamente falando, você nem precisa de find . Você pode fazer tudo no shell (consulte aqui para obter uma explicação sobre a manipulação da string do shell habilidades):

for file in **/*.orig; do 
    newname="${file%%.*}_1.${file#*.}"
    mv "$file" "${newname/.orig/}"
done

Por fim, uma observação sobre globs ( rename usa uma glob, não uma expressão regular ). A -name é a sintaxe do Windows glob para "qualquer coisa que termine em *.*.orig ". O equivalente e o que você deve usar com seu .orig é find . O *.orig sozinho corresponde a qualquer coisa, usando * somente corresponderá aos nomes de arquivos com duas extensões, a última delas é *.*.orig .

    
por 20.10.2015 / 15:53
1

Em primeiro lugar, você deve verificar qual versão de renomeação instalou em seu sistema

readlink -e $(which rename)

Portanto, para prename (padrão em hosts .deb):

prename 's/(\.[^.]*)\.orig/_1$1/' *.*.orig

e para rename.ul do pacote util-linux

rename.ul \. _1\. *.*.orig     #add «_1» into file name
rename.ul \.orig '' *.*.orig   #remove «.orig» extention
    
por 20.10.2015 / 15:45