Como renomear em lote nomes de arquivos longos em curtos no Linux?

1

Eu tenho muitos dados com o nome do arquivo (apenas por exemplo):

dt_upd_global_merged_madt_uv_20100801_20100801_20110721.bil
dt_upd_global_merged_madt_uv_20100802_20100802_20110721.bil
dt_upd_global_merged_madt_uv_20100803_20100803_20110721.bil

O que devo fazer se eu quiser renomear os arquivos para o seguinte?

20100801.bil
20100802.bil
20100803.bil
    
por ahmad 04.02.2014 / 07:59

3 respostas

2

Tente isto:

for f in *.bil; do

    n=$(echo "${f}"|sed -r 's/^.+([0-9]{8})__[0-9]{8}[.]bil$//'|grep -Ev '.bil$')
   #or:
   #n='echo "${f}"|sed -r 's/^.+([0-9]{8})__[0-9]{8}[.]bil$//'|grep -Ev '.bil$''

    if [ -n "${n}" ]; then
        mv "${f}" "${n}.bil"
    fi
done
    
por 04.02.2014 / 11:38
2

Maneira mais fácil com o Zsh (chamando zsh primeiro, obviamente):

autoload -U zmv
zmv 'dt_upd_global_merged_madt_uv_(*)_(*)_(*).bil' '$1.bil'

Ou com o Perl rename :

rename 's/dt_upd_global_merged_madt_uv_(.*)_(.*)_(.*).bil/$1.bil/' *.bil
    
por 04.02.2014 / 11:44
1

Usando o awk, a opção -F para especificar _ como o delimitador. A saída do sétimo campo mais ".bil" (por exemplo) coloca 20100801.bil na variável fnew . Então mv o nome original para o novo nome.

    for f in *.bil
    do
        fnew=$(awk -F_ '{print $7 ".bil"}' <<< $f);
        mv $f $fnew
    done
    
por 04.02.2014 / 12:01

Tags