我有一个循环,它会遍历目录中的文件并重命名它们。
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)
我该如何去做呢?
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-rename的prename工具并使用类似的东西
perl-rename '$N=sprintf("%05d",++$N); s/(.*)(\.[^.]*)/$1$N$2/' *
Run Code Online (Sandbox Code Playgroud)
这里我跳过了这一date部分,因为你从未显示过文件的原始名称。简单的字符串操作可能足以将日期转换为YYYYMMDD格式。
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |