我想将目录中的文件重命名为顺序数字。根据文件的创建日期。

例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。


当前回答

让我们假设我们在一个目录中有这些文件,按照创建的顺序列出,第一个是最古老的:

a.jpg
b.JPG
c.jpeg
d.tar.gz
e

然后ls -1cr输出上面的列表。然后你可以使用rename:

ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'

的输出

rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)

对于没有扩展名的文件,会显示警告“使用未初始化的值[…]”;你可以忽略它。

从rename命令中删除-n以实际应用重命名。

这个答案的灵感来自于Luke在2014年4月的回答。它忽略了Gnutt的要求,即根据文件总数设置前导零的数量。

其他回答

为了在所有情况下都能工作,在名称中有空格的文件中加上“\”

find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash

我喜欢gauteh的解决方案,因为它简单,但它有一个重要的缺点。当在数千个文件上运行时,您可能会得到“参数列表太长”的消息(更多关于此的信息),其次,脚本可能会变得非常慢。在我的例子中,在大约36.000个文件上运行它,脚本移动了大约。每秒一件!我不太确定为什么会发生这种情况,但我从同事那里得到的规则是“找到的才是朋友”。

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

为了计算项目和构建命令,使用了gawk。不过,请注意主要的区别。默认情况下,find搜索当前目录及其子目录中的文件,因此,如果需要,请确保仅限制在当前目录上搜索(使用man find查看如何执行)。

以下是对我有效的方法。 我已经使用重命名命令,这样如果任何文件包含空间的名称,那么mv命令不会混淆空间和实际文件。

Here i replaced spaces , ' ' in a file name with '_' for all jpg files
#! /bin/bash
rename 'y/ /_/' *jpg         #replacing spaces with _
let x=0;
for i in *.jpg;do
    let x=(x+1)
    mv $i $x.jpg
done

一个非常简单的bash一行代码,它保留了原来的扩展名,增加了前导零,并且也适用于OSX:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

简化版http://ubuntuforums.org/showthread.php?t=1355021

我也遇到过类似的问题,并为此编写了一个shell脚本。尽管已经有很多好的答案,我还是决定把它贴出来,因为我觉得它对别人有帮助。请随意改进它!

@Gnutt你想要的行为可以通过输入以下内容来实现:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

如果-r选项被省略,扩孔将只模拟(应该有助于测试)。

动作L描述目标数字的长度(将用前导零填充) 也可以使用选项添加前缀/后缀-p <prefix> -s <suffix>。

如果有人想在文件编号之前按数字排序,只需删除-o modtime选项。