如何在 bash 脚本中计算数组中带有前导零的项目?

ant*_*pug 0 bash shell

我有一个循环,它会遍历目录中的文件并重命名它们。

for f in *
   do
      mv -n "$f" "$prefix_$(date -r "$f" +"%Y%m%d").${f#*.}"
   done
Run Code Online (Sandbox Code Playgroud)

我需要在末尾附加序列号,例如

TEST_20200505_00001.NEF
TEST_20200505_00002.NEF
TEST_20200505_00155.NEF
Run Code Online (Sandbox Code Playgroud)

我该如何去做呢?

Soc*_*owi 5

仅使用标准工具 ( bash, mv, date)

添加一个在每次循环迭代时进行计数的变量。然后使用printf添加前导零。

#! /usr/bin/env bash
c=1
for f in *; do
  mv -n "$f" "${prefix}_$(date -r "$f" +%Y%m%d)_$(printf %05d "$c").${f#*.}"
  (( c++ ))
done
Run Code Online (Sandbox Code Playgroud)

这里我们使用固定宽度的五位数作为序列号。如果您只想根据需要使用尽可能少的数字,可以使用以下方法:

#! /usr/bin/env bash
files=(*)
while read i; do
  f="${files[10#$i]}"
  mv -n "$f" "${prefix}_$(date -r "$f" +%Y%m%d)_$i.${f#*.}"
done < <(seq -w 0 "$((${#files[@]}-1))")
Run Code Online (Sandbox Code Playgroud)

如果最多只有 9 个文件,则将使用 1 位数字;如果只有 10 到 99 个文件,则将使用 2 位数字;如果只有 100 到 999 个文件,则将使用 3 位数字,依此类推。

如果您想知道10#$i:Bash 将带有前导零的数字解释为八进制数字,即 010 = 8 和 08 = 错误。为了正确解释 生成的数字,seq -w我们使用前缀手动指定基数10#

使用专用工具

对于批量重命名文件,您不必重新发明轮子。rename安装类似//perl-renameprename工具并使用类似的东西

perl-rename '$N=sprintf("%05d",++$N); s/(.*)(\.[^.]*)/$1$N$2/' *
Run Code Online (Sandbox Code Playgroud)

这里我跳过了这一date部分,因为你从未显示过文件的原始名称。简单的字符串操作可能足以将日期转换为YYYYMMDD格式。