在Linux下如何批量将长文件名重命名为短文件名?

在Linux下如何批量将长文件名重命名为短文件名?

我有很多带有文件名的数据(仅作为示例):

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

答案1

尝试这个:

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'

或者使用 Perl rename

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

答案3

使用 awk,-F 选项指定_为分隔符。第 7 个字段输出加上“.bil”(例如)放置20100801.bilfnew变量中。然后将原始名称 mv 为新名称。

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

相关内容