Perl 如何使用随机名称一起重命名多个文件

Perl 如何使用随机名称一起重命名多个文件,perl,file-rename,Perl,File Rename,我有随机名称的文件,我想把它们一起重命名,比如Trace1、Trace2等等。。。。有什么想法吗?您可以使用shell命令: i=1; for f in * do mv $f "Trace$i" i=$(($i+1)) done 这将检查是否存在名为Trace 35;的现有文件,并避免对它们进行重击 use Path::Class qw( dir ); use List::Util qw( max ); my $dir = dir(...); my @files =

我有随机名称的文件,我想把它们一起重命名,比如Trace1、Trace2等等。。。。有什么想法吗?

您可以使用shell命令:

i=1;
for f in *
do
    mv $f "Trace$i"
    i=$(($i+1))
done

这将检查是否存在名为
Trace 35;
的现有文件,并避免对它们进行重击

use Path::Class qw( dir );
use List::Util  qw( max );

my $dir = dir(...);

my @files =
   map $_->basename(),
    grep !$_->is_dir(),
     $dir->children();

my $last =
   max 0,
    map /^Trace([0-9]+)\z/,
     @files;

my $errors;
for (@files) {
   my $old = $dir->file($_);
   my $new = $dir->file("Trace" . ++$last);
   if (!rename($new, $old)) {
      warn("Can't rename \"$old\" to \"$new\": $!\n");
      ++$errors;
   }
}

exit($errors ? 1 : 0);
或者在Perl中:

#!/usr/bin/perl
use strict;
use warnings;

# use dirname() to keep the renamed files in the same directory
use File::Basename qw( dirname );

my $i = 1;
for my $file (@ARGV) {
    rename $file, dirname($file) . "/Trace$i"; 
    print "$file -> Trace$i\n";
} continue { $i++ }
如果您是Linux新手,还需要记住使脚本可执行(假设脚本保存在名为
random renamer
的文件中):

然后运行它(重命名
random files
目录中的所有文件):


“一起重命名”是什么意思?您可以在shell中执行(复制并粘贴它)。但是要小心:现在的代码将重命名当前目录中的所有文件。如果您只需要一组特定的文件(如所有的.txt文件),则将
*
替换为描述它们的列表或其他模式(例如
*.txt
)。此外,它假设没有与
Trace*
匹配的现有文件。您还可以使用一个过滤
Trace
文件的命令轻松地替换
*
:f in$(ls*|grep-v^Trace)的
。对于一个实际的脚本来说,任务太简单了。@Gingi:如果有带空格的文件名,这将不起作用。驱动
for
循环的反勾号通常是有问题的,解析
ls
输出基本上总是有问题的<代码>用于f in*;跟踪*)中的案例$f是否继续;;以撒。。。done
是一个很好的解决方法。
((i+1))
构造是一种巴什主义。它在基本Bourne shell中不起作用。
chmod 755 random-renamer
./random-renamer random-files/*