Renomeia recursivamente arquivos mantendo todos os caracteres que precedem um sublinhado

3

Eu tenho a necessidade de renomear recursivamente vários milhares de arquivos em uma máquina CentOS 7 atualmente no formato de:

(32-64 alphanumerics)_various special characters.wav

Em suma, gostaria de remover recursivamente a extensão _ até .wav de todos os arquivos com 3 níveis de profundidade (NOTA: Todas as extensões são .wav )

Exemplo: Existente:

/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5_7075276189 by [email protected] @ 8_44_52 AM.wav

/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE_2018690759 by [email protected] @ 1_26_55 PM.wav

Desejado:

/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5.wav

/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE.wav

Eu pesquisei bastante e vi muitas maneiras de modificar outras partes do nome do arquivo, mas não reter tudo antes de um caractere específico ( _ ) e a extensão.

Agradecemos antecipadamente por qualquer assistência.

    
por Scott B 19.12.2016 / 18:28

3 respostas

2

Você tem que extrair a parte do diretório, o nome do arquivo e os caracteres precedendo o sublinhado primeiro (já que todos os arquivos são .wav , não há sentido salvar a extensão em uma variável separada):

find /home/scott/ -maxdepth 4 -type f -name '*_*.wav' -exec sh -c 'h=${1%/*}
t=${1##*/}; echo mv "$1" "${h}/${t%%_*}".wav' doom {} \;

remova o echo para realmente renomear os arquivos.

    
por 20.12.2016 / 03:12
1

I've searched a great deal and have seen many ways to modify other parts of the filename but not retain everything before a specific character (_) and the extension.

Este sed parece fazer o truque: sed -E 's/(.*)_[0-9].* by .*(\.wav)//'

echo "/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5_7075276189 by [email protected] @ 8_44_52 AM.wav" | sed -E 's/(.*)_[0-9].* by .*(\.wav)//'
/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5.wav

Testando na sua outra string de exemplo:

echo "/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE_2018690759 by [email protected] @ 1_26_55 PM.wav" | sed -E 's/(.*)_[0-9].* by .*(\.wav)//'
/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE.wav

Com sed , você salva partes de sua expressão com () e depois as coloca de volta com .

    
por 19.12.2016 / 18:50
1

Instale qualquer uma das implementações prename (renomear Perl), por exemplo File::Rename ou o de Unicode::Tussle . (A última vez que eu olhei, o CentOS não veio com qualquer renomeação Perl, apenas com o util-linux rename que não pode fazer o que você precisa, mas isso pode ter mudado no CentOS 7.) Todos eles têm a sintaxe básica prename CODE FILENAME... onde CODE é algum código Perl que é aplicado para transformar cada nome de arquivo.

find /home/user/recordings/ -type f -exec prename 's!_[^/]*(\.[^./]*)$!$1!' {} +

Explicação para o Perl: (\.[^./]*)$ corresponde à extensão no final do nome; _[^/]* corresponde a tudo no nome do arquivo sem a parte do diretório (sem barras) a partir do primeiro sublinhado. A substituição é $ , ou seja, a parte no primeiro e único grupo entre parênteses.

    
por 20.12.2016 / 14:39

Tags