将文件夹中的文件重命名为连续编号
我想将目录中的文件重命名为连续编号。 基于文件的创builddate。
对于例如sadf.jpg
到0001.jpg
, wrjr3.jpg
到0002.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
如果你的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