我的一个文件夹中有 200 个文件。我按特定顺序下载了它们 - 通常只相隔几秒钟。我想在每个文件的开头附加一个数字。
因此,我下载的第一个文件(最旧的文件)需要从 更改name.txt
为001_name.txt
。
一直到最后一个文件(最近下载的)从 更改name.txt
为200_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
我只是测试了一下,它对我有用。