Renomeando múltiplos arquivos com 2 períodos consecutivos dentro do nome

0

Eu preciso usar o comando rename para renomear centenas de arquivos que contenham .. (2 períodos) dentro do nome do arquivo e alterar .. para - (hífen). O fato de conter períodos parece confundir o comando renomear.

Aqui estão alguns nomes de arquivo de exemplo:

20180201_190000_TX_AJAX..HHE_instrument_0456 
20180201_190000_TX_AJAX..HHN_instrument_0456 
20180201_190000_TX_AJAX..HHZ_instrument_0456

Eu preciso renomear esses arquivos para procurar linke:

20180201_190000_TX_AJAX-HHE_instrument_0456 
20180201_190000_TX_AJAX-HHN_instrument_0456 
20180201_190000_TX_AJAX-HHZ_instrument_0456

Este comando:

rename 's/../-/' *

resulta nesses nomes de arquivo:

-180201_190000_TX_AJAX..HHE_instrument_0456 -180201_190000_TX_AJAX..HHN_instrument_0456 -180201_190000_TX_AJAX..HHZ_instrument_0456

Parece que os períodos têm algum propósito especial, então está ficando confuso. Eu então tentei isso:

rename 's/..H/-H/' *

O AJAX na amostra representa uma estação e estas variam. A sintaxe acima funciona e resulta em "20180201_190000_TX_AJAX-HHE_instrument_0456" como esperado para muitas estações, mas resultados inesperados para outras pessoas:

20180201_000000_SA.AKHBR..HNE_instrument_0542 renamed as 20180201_000000_SA.-HBR..HNE_instrument_0542

20180201_000000_SA.KSHB4..HHE_instrument_0935 renamed as 20180201_000000_SA.-HB4..HHE_instrument_0935

20180201_000000_SA.HTM01..HHE_instrument_0933 renamed as 20180201_000000_S-HTM01..HHE_instrument_0933

Parece que qualquer estação que contenha a letra H fica confusa.

Para alguma referência, o AJAX é um código de estação e os códigos de estação têm 4 ou 5 caracteres de comprimento.

Em seguida, tentei isso:

rename ‘s/SA.????..H/SA.????-H/ * -n 

mas isso gera um erro:

"Nested quantifiers in regex; marked by <-- HERE in m/SA.??? <-- HERE ?..H/ at (eval 1) line 1."

então eu acho que não gosta de curingas.

Qualquer ajuda que você possa fornecer é bem-vinda.

    
por Suzan Kowalski 07.03.2018 / 17:48

2 respostas

2

Tente isto:

rename -n 's/\.\./-/' ./*

O caractere . em significa qualquer caractere , então combina com tudo!

Remova -n quando estiver satisfeito com seus testes

    
por 07.03.2018 / 17:55
0

O ponto corresponderá a qualquer caractere, de modo que o ponto duplo corresponda aos dois primeiros caracteres nos nomes de arquivo, e é por isso que eles estão sendo substituídos por um traço de rename . Ou escape de cada ponto na expressão regular como \. ou use um loop (isso é escrito para bash ):

for name in ./*..*; do
    newname=${name/../-}
    printf 'Would move %s to %s\n' "$name" "$newname"
    # mv -i "$name" "$newname"
done

Execute uma vez e certifique-se de que a saída seja a correta antes de remover o # e executar novamente.

O loop irá iterar todos os nomes no diretório atual que contém dois pontos consecutivos. A substituição do parâmetro ${name/../-} substituirá a primeira ocorrência de dois pontos consecutivos por um traço. Este é um padrão de globalização de nome de arquivo de shell, então o ponto não é especial de forma alguma.

    
por 25.10.2018 / 12:00

Tags