Como renomear múltiplos arquivos contendo _ e.

2

No shell bash do linux, eu tenho vários arquivos tif (por volta de 1000) da seguinte forma:

Sep04_17.00.37.tif  Sep04_17.05.54.tif  Sep04_17.08.41.tif
Sep04_17.02.02.tif  Sep04_17.07.17.tif

Como posso remover o _ e. nos nomes? o resultado final deve ser:

Sep04170037.tif  Sep04170554.tif  Sep04170841.tif
Sep04170202.tif  Sep04170717.tif

Eu tentei renomear: rename 's/\_/\//' *.tif ; rename 's/\_/\//g' *.tif ; nenhum deles funciona.

    
por haishan 08.09.2018 / 19:45

2 respostas

1

Você está tendo a abordagem correta. Talvez você tenha perdido o g na expressão regex que permite corresponder todas as ocorrências de . e _ em cada nome de arquivo.

Para uso com rename , sugiro esta abordagem em duas etapas:

rename 's/[._]//g' *.tif    # remove any . and _ occurence

cedendo:

Sep04170037tif Sep04170202tif Sep04170554tif Sep04170717tif Sep04170841tif

Então

rename 's/tif$/.tif/' *tif    # replace ending tif by .tif

resultando em

Sep04170037.tif Sep04170202.tif Sep04170554.tif Sep04170717.tif Sep04170841.tif

Não hesite em testar seus regexes on-line primeiro, por exemplo, em regex101 , que também ensina muitas coisas sobre pcre:)

[EDIT]: se você preferir frases de uma só vez:

rename 's/[._]//g;s/tif$/.tif/' *.tif

Também evitará a correspondência de arquivos não relacionados próximos e infortunados que, infelizmente, também terminarão com tif durante a segunda etapa.

    
por 08.09.2018 / 20:08
0

Uma variante usando sed :

for file in *tif; do newname=$(echo "$file" | sed 's/_//;s/\.\([0-9]\)//g'); mv -v "$file" "$newname"; done
'Sep04_17.00.37.tif' -> 'Sep04170037.tif'
'Sep04_17.02.02.tif' -> 'Sep04170202.tif'
'Sep04_17.05.54.tif' -> 'Sep04170554.tif'
'Sep04_17.07.17.tif' -> 'Sep04170717.tif'
'Sep04_17.08.41.tif' -> 'Sep04170841.tif'

Usando mv -v no exemplo apenas para mostrar antes / depois.

    
por 08.09.2018 / 19:49

Tags