1

У меня есть много данных с именем файла (только для примера):

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

Что мне делать, если я хочу переименовать эти файлы в следующее?

20100801.bil
20100802.bil
20100803.bil

3 ответа3

2

Попробуй это:

for f in *.bil; do

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

    if [ -n "${n}" ]; then
        mv "${f}" "${n}.bil"
    fi
done
2

Самый простой способ с Zsh (очевидно, сначала вызвав zsh ):

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

Или с rename Perl:

rename 's/dt_upd_global_merged_madt_uv_(.*)_(.*)_(.*).bil/$1.bil/' *.bil
1

Используя опцию awk, -F для указания _ в качестве разделителя. Выход 7-го поля плюс «.bil» (например) помещает 20100801.bil в переменную fnew . Затем перенесите оригинальное имя в новое имя.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .