linux 命令按顺序将日期 (YYYY.MMDD) 重命名为数字 (001,002,...,066,067)

linux command rename dates (YYYY.MMDD) to numbers(001,002,...,066,067) sequentially

我使用“rename”重命名了许多文件。

但是,我发现将日期转换为数字有问题。

文件名为2021.0801,2021.0802,..等等(Year.Month&日期)

我需要将月份和日期部分更改为 001、002 等数字

所以我需要重命名

2021.0801
2021.0802
...
2021.0929
2021.0930

2021.001
2021.002
...
2021.0**
2021.0**

我看到当我使用重命名或# 时我可以做到这一点,?但是没看到具体的解决办法

能告诉我重命名这些的方法吗?

p.s。我试过 num=001; for i in {0801..0930}; do rename $i $num *; (($num++)); done 但它显示

2021.001
2021.001001
2021.001001001001
...

此外,ls 2021.* 仅显示我要更改的文件。

您不需要 for 循环。这条命令将完成所有工作:

rename -n 'BEGIN{our $num=1}{our $num;s/\d+$/sprintf("%03d", $num)/e; $num += 1}' 2021.*

一旦重命名看起来不错,请删除 -n

您的脚本包含一些错误。我建议使用 https://www.shellcheck.net/ 检查你的脚本。

修复错误后,(未完成的)结果是

#!/bin/bash
num=001; for i in {0801..0930}; do rename "$i" "$num" ./*; ((num++)); done

这还有 3 个问题。

  1. 范围 {0801..0930} 包括数字 08310832、... 08990900。这可以通过使用两个范围 {0801..0831} {0901..0930}
  2. 来解决
  3. 增量操作((num++))不保留前导零。这可以通过有条件地添加 1 或 2 个零来解决。
  4. 您为每个组合调用 rename,这将检查所有文件并且可能只重命名一个文件。如您所知,您可以用 mv 命令替换它。

最终版本是

num=1; for i in {0801..0831} {0901..0930}; do
  if [[ num -lt 10 ]] ; then
    new="00$num";
  elif [[ num -lt 100 ]] ; then
    new="0$num";
  else
    new="$num"; # this case is not necessary here
  fi;
  mv "2021.$i" "2021.$new";
  ((num++));
done 

该脚本处理 1、2 或 3 位数字值的前导零,此处不需要,因为所有数字都小于 100。对于这种情况,可以简化为

num=1; for i in {0801..0831} {0901..0930}; do
  if [[ num -lt 10 ]] ; then
    new="00$num";
  else
    new="0$num";
  fi;
  mv "2021.$i" "2021.$new";
  ((num++));
done 

脚本将执行这些命令:

mv 2021.0801 2021.001
mv 2021.0802 2021.002
...
mv 2021.0830 2021.030
mv 2021.0831 2021.031
mv 2021.0901 2021.032
mv 2021.0902 2021.033
...
mv 2021.0929 2021.060
mv 2021.0930 2021.061