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 个问题。
- 范围
{0801..0930}
包括数字 0831
、0832
、... 0899
、0900
。这可以通过使用两个范围 {0801..0831} {0901..0930}
来解决
- 增量操作
((num++))
不保留前导零。这可以通过有条件地添加 1 或 2 个零来解决。
- 您为每个组合调用
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
我使用“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 个问题。
- 范围
{0801..0930}
包括数字0831
、0832
、...0899
、0900
。这可以通过使用两个范围{0801..0831} {0901..0930}
来解决
- 增量操作
((num++))
不保留前导零。这可以通过有条件地添加 1 或 2 个零来解决。 - 您为每个组合调用
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