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


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

Answers:


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'

或者使用Perl rename

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.