我有很多带有文件名的数据(仅作为示例):
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.bil
在fnew
变量中。然后将原始名称 mv 为新名称。
for f in *.bil
do
fnew=$(awk -F_ '{print $7 ".bil"}' <<< $f);
mv $f $fnew
done