将文件夹中的文件重命名为连续编号

我想将目录中的文件重命名为连续编号。 基于文件的创builddate。

对于例如sadf.jpg0001.jpgwrjr3.jpg0002.jpg等等,根据文件总量的前导零的数量(如果不需要,不需要额外的零)。

尝试使用循环, let ,和填充的printf

 a=1 for i in *.jpg; do new=$(printf "%04d.jpg" "$a") #04 pad to length of 4 mv -i -- "$i" "$new" let a=a+1 done 

使用-i标志可防止自动覆盖现有文件。

美在一条线

 ls | cat -n | while read nf; do mv "$f" "$n.extension"; done 

改变所需的PNG,JPG或其他一些扩展。

我很喜欢gauteh的解决scheme,但它有一个重要的缺点。 当运行在数千个文件上时,你可能会得到“参数列表太长”的消息( 更多关于这个 ),其次,脚本可能变得非常慢。 在我的情况下,运行在大约36000个文件,脚本移动约。 每秒一个项目! 我不确定为什么发生这种情况,但是我从同事处得到的规则是find你的朋友”

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

为了计算物品和build立命令,使用了gawk 。 注意主要区别,虽然。 默认情况下, find当前目录及其子目录中的文件,因此必须仅限于search当前目录(必要时使用man find查看)。

在OSX上使用Pero的解决scheme需要进行一些修改。 我用了:

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

注意:反斜线在那里用于续行

编辑2015年7月20日:合并@ klaustopher的反馈引用mv命令的\"%s\"参数以支持具有空格的文件名。

用“重命名”命令

 rename -N 0001 -X 's/.*/$N/' *.jpg 

要么

 rename -N 0001 's/.*/$N.jpg/' *.jpg 

要在所有情况下工作,请为名称中包含空格的文件添加“\”

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

一个非常简单的bash单线程保持原来的扩展,增加了前导零,也适用于OSX:

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

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

如果你的rename不支持-N ,你可以这样做:

 ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e' 

编辑要开始给定的数字,你可以使用下面的(看起来有些丑陋的)代码,只需要用你想要的数字代替123:

 ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e' 

这按创build时间顺序列出文件(最新的第一个,添加-r到ls反向sorting),然后发送这个文件列表进行重命名。 重命名使用正则expression式中的Perl代码来格式化和增加计数器。

但是,如果您使用EXIF信息处理JPEG图像,我build议使用exiftool

这是来自exiftool文档的 “重命名示例”

  exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and preserving the original file extension (%e). Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string. 

你也可以用ls

 ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash 

我有一个类似的问题,并为此写了一个shell脚本。 我决定发布它,不pipe有多less好的答案已经发布,因为我认为这可能对某人有所帮助。 随意改善它!

且具

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

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

如果选项-r被忽略,则只能仿真扩展(应该对testing有帮助)。

情绪L描述目标号码的长度(将用前导零填充)也可以用选项-p <prefix> -s <suffix>添加前缀/后缀。

如果有人希望文件在编号之前进行数字sorting,只需删除-o modtime选项。

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

 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) 

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

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

这个答案是受到卢克2014年4月答案的启发。 它忽略了Gnutt根据文件总量设置前导零的数量的要求。

再次使用Pero的解决scheme进行很less的修改,因为find将遍历目录树中的顺序项存储在目录条目中。 这将(主要)从运行到运行一致,在同一台机器上,如果没有删除,实质上就是“文件/目录创build顺序”。

但是,在某些情况下,您需要按照名称在本例中使用某些逻辑顺序。

 find -name '*.jpg' | sort -n | # find jpegs gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command bash # run that command 
 a=1 for i in *.jpg; do mv -- "$i" "$a.jpg" a=`expr $a + 1` done 

大多数其他解决scheme将覆盖已经命名为数字的现有文件。 如果运行脚本,添加更多文件,然后再次运行脚本,这尤其是个问题。

该脚本首先重命名现有的数字文件:

 #!/usr/bin/perl use strict; use warnings; use File::Temp qw/tempfile/; my $dir = $ARGV[0] or die "Please specify directory as first argument"; opendir(my $dh, $dir) or die "can't opendir $dir: $!"; # First rename any files that are already numeric while (my @files = grep { /^[0-9]+(\..*)?$/ } readdir($dh)) { for my $old (@files) { my $ext = $old =~ /(\.[^.]+)$/ ? $1 : ''; my ($fh, $new) = tempfile(DIR => $dir, SUFFIX => $ext); close $fh; rename "$dir/$old", $new; } } rewinddir $dh; my $i; while (my $file = readdir($dh)) { next if $file =~ /\A\.\.?\z/; my $ext = $file =~ /(\.[^.]+)$/ ? $1 : ''; rename "$dir/$file", sprintf("%s/%04d%s", $dir, ++$i, $ext); } 

该脚本将按照Mac OS bash上的创builddate对文件进行sorting。 我用它来批量重命名video。 只需更改扩展名和名称的第一部分。

 ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash 

这里用“重命名”命令的另一个解决scheme是:

 find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge' 

要将6000个文件重新编号,可以使用ACDsee程序的“重命名”选项。

为了定义一个前缀,使用这种格式: ####"*"

然后设置开始号码并按重命名,程序将使用连续号码重命名所有6000个文件。

按时间sorting,限于jpg,前导零和基本名称(以防您可能需要):

 ls -t *.jpg | cat -n | \ while read nf; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done 

(全部在一行,没有\

在OSX上 ,从Homebrew安装重命名脚本:

 brew install rename 

那么你可以很容易地做到这一点:

 rename -e 's/.*/$N.jpg/' *.jpg 

或者添加一个不错的前缀:

 rename -e 's/.*/photo-$N.jpg/' *.jpg 

佩罗的回答让我在这里:)

我想重命名相对于时间的文件,因为图像浏览者没有按照时间顺序显示图像。

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