我想将目录中的文件重命名为顺序数字。根据文件的创建日期。
例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。
我想将目录中的文件重命名为顺序数字。根据文件的创建日期。
例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。
当前回答
在OSX上使用Pero的解决方案需要一些修改。我使用:
find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash
注意:反斜杠是用来换行的
2015年7月20日编辑: 合并@ klastopher的反馈来引用mv命令的“%s\”参数,以支持带空格的文件名。
其他回答
大多数其他解决方案将覆盖已命名为数字的现有文件。如果运行脚本,添加更多文件,然后再次运行脚本,这尤其是个问题。
这个脚本首先重命名现有的数字文件:
#!/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);
}
以下是对我有效的方法。 我已经使用重命名命令,这样如果任何文件包含空间的名称,那么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
使用sed:
ls -tr | sed "s/(.*)/mv '\1' \=printf('%04s',line('.').jpg)/" > rename.sh
bash rename.sh
通过这种方式,您可以在执行脚本之前检查脚本,以避免出现大错误
让我们假设我们在一个目录中有这些文件,按照创建的顺序列出,第一个是最古老的:
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的要求,即根据文件总数设置前导零的数量。
在OSX上使用Pero的解决方案需要一些修改。我使用:
find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash
注意:反斜杠是用来换行的
2015年7月20日编辑: 合并@ klastopher的反馈来引用mv命令的“%s\”参数,以支持带空格的文件名。