按数字重命名文件(日期/时间顺序)

按数字重命名文件(日期/时间顺序)

我的一个文件夹中有 200 个文件。我按特定顺序下载了它们 - 通常只相隔几秒钟。我想在每个文件的开头附加一个数字。

因此,我下载的第一个文件(最旧的文件)需要从 更改name.txt001_name.txt

一直到最后一个文件(最近下载的)从 更改name.txt200_name.txt

我如何使用命令行来做到这一点?

答案1

下列操作将导致文件包含换行符时出错,但其他情况下应该可以正常工作。它将根据文件上次修改的时间而不是实际创建时间对文件进行排序,因为 Ubuntu 不存储文件的创建时间。因此,如果您在下载文件后修改了文件,则无法获得准确的排序。

n=0; ls -tr | while read i; do n=$((n+1)); mv -- "$i" "$(printf '%03d' "$n")"_"$i"; done

ls -tr按修改时间对文件进行排序,最旧的在最前面(并且当您通过管道传输 ls 的输出时,它会自动按每行一个文件列出,而不是按照标准方式列出 - 应该注意,这是一种 GNU 主义,如果您必须在另一个具有不同版本的 *nix 上工作ls,情况可能并非如此)。while read i获取该列表并逐一检查每个项目,其余部分执行实际的重命名。

n=$((n+1))将变量加$n一。如果事先设置了该值,可能会出现问题,因此为了安全起见,您应该在行首将其设置为 0。

$(printf '%03d' "$n")打印变量 $n 中包含的数字,填充三个零(因此为 001、002 ... 087 ... 999)。我希望该mv命令相当明显。

答案2

下面的脚本可以完成这个工作:

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

count=1
ls -tr $@ | while read file; do
    if [ $count -lt 10 ]; then
        mv -v $file '00'$count'_'$file
    elif [ $count -lt 100 ]; then
        mv -v $file '0'$count'_'$file
    else
        mv -v $file '0'$count'_'$file
    fi
    count=$(($count+1))
done

我只是测试了一下,它对我有用。

相关内容