如何在保持文件名中间不变的情况下重命名文件

时间:2019-06-12 18:59:38

标签: bash

我正在尝试使用for循环和mv命令重命名多个文件。

从:

ATEST1.012345
AZEST2.098765
AZEST3.120565

收件人:

atest1.012345_0619
azest2.098765_0619
azest3.120565_0619

这是我尝试过的:

#!/bin/bash

DIR=$1

for file in $DIR/ATEST1.??????
do
  mv "$file" "${file%}_$(date +%m%y)"
done

for file in $DIR/AZEST2.??????
do
  mv "$file" "${file%}_$(date +%m%y)"
done

for file in $DIR/AZEST3.??????
do
  mv "$file" "${file%}_$(date +%m%y)"
done

结果是:ATEST1.12345_0619,AZEST2.098765_0619,AZEST3.120565_0619。

我不确定如何将数字保留在中间并仅更改字母并添加_MMYY日期。

4 个答案:

答案 0 :(得分:1)

我会尝试

cd "$DIR" && find . -name "ATEST*" -o -name "AZEST*" | \
while read file;
     do mv "$file" "$(echo $file | tr [[:upper:]] [[:lower:]])_$(date +%m%y)";
done

我建议使用echo代替mv进行某种空试

答案 1 :(得分:0)

使用GNU sed,您可以使用\L从大写切换为小写:

DIR=$1
for f in $DIR/ATEST1.??????; do
  mv $f $(sed "s/.*/\L&_$(date +%m%y)/" <<< "$f")
done

答案 2 :(得分:0)

rename命令允许您进行批量文件重命名。

rename  'y/A-Z/a-z/; s/(.*)$/$1_0619/' A*
  • 第一个(y / A-Z / a-z /)表达式将大写字母替换为小写字母
  • Second()表达式将_0619追加到文件名

您可以使用-n标志在空运行模式下执行。

答案 3 :(得分:0)

使用tr:

for f in $DIR/ATEST1.??????
do
    mv "$f" $(tr '[[:upper:]]' '[[:lower:]]' <<< "$f")_$(date +%m%y)
done