按照 UNIX 中的固定模式重命名文件

Rename file as per fixed patter in UNIX

我的目录中有这些文件:

APPLE_STORE_iphone12.csv
APPLE_STORE_iphonex.csv
APPLE_STORE_ipad.csv
APPLE_STORE_imac.csv

需要在匹配模式“APPLE_STORE_”之后重命名文件。

必填O/P

APPLE_STORE_NY_iphone12_20210107140443.csv
APPLE_STORE_NY_iphonex_20210107140443.csv
APPLE_STORE_NY_ipad_20210107140443.csv
APPLE_STORE_NY_imac_20210107140443.csv

这是我尝试过的:

filelist=/mydir/APPLE_STORE_*.csv

dtstamp=`date +%Y%m%d%H%M%S`

location='NY'

for file in ${filelist}
do

        filebase=${file%.csv}
        mv ${file} ${filebase}_${location}_${dtstamp}.csv
done

这给我起的名字像 APPLE_STORE_imac_NY_20210107140443.csv

你们真亲密

destfile="$(echo $file | sed -e 's/^APPLE_STORE/APPLE_STORE_${location}/' -e 's/\.csv$/${dtstamp}.csv/')"`
mv "$file" "$destfile"

...或类似的东西。

另一种(可能不太优雅)的方法是首先使用带有分隔符“_”的 awk 将文件名明确地分成几部分,然后根据需要重新构建它。您的脚本可能如下所示:

#!/bin/bash
filelist=./APPLE_STORE_*.csv
dtstamp=`date +%Y%m%d%H%M%S`
location='NY'

for file in ${filelist}
do

  filebase=${file%.csv}
  part1=`echo ${filebase} | awk -v FS="_" '{print }'`
  part2=`echo ${filebase} | awk -v FS="_" '{print }'`
  part3=`echo ${filebase} | awk -v FS="_" '{print }'`
  mv ${file} ${part1}_${part2}_${location}_${part3}_${dtstamp}.csv

done

我测试成功了