【问题标题】:How to rename files in a for loop in Perl如何在 Perl 的 for 循环中重命名文件
【发布时间】:2010-12-29 11:53:52
【问题描述】:

我正在运行一个 Perl 脚本并尝试完成如下重命名文件..

我有一个包含其他不相关文件的文件夹中的 *.ru.jp 文件列表。我想用一个作为计数器变量的数字重命名。

在 Bash 中,我会这样做......

for i in $(ls *.ru.jp); do x=${i%%.*}; mv $i  "$x"t"$counter".ru.jp ;done

例如,如果计数器为 1,则 myfile.ru.jp 将重命名为 myfilet1.ru.jp。“t”只是表示 t1、t2...等的命名。最重要的是有一个外部循环,随着计数器变量的增加,最终将标记 mafilet2.ru.jp 等等。

我想知道如何编写和表示与 Perl 脚本中类似的 for 循环?

谢谢。

-乔伊

【问题讨论】:

    标签: perl loops for-loop rename file-rename


    【解决方案1】:
    perl -e 'for $old (@ARGV) {
               ++$counter;
               if (($new=$old) =~ s/(\.ru\.jp)\z/t$counter$1/) {
                 rename $old => $new or warn "$0: rename: $!\n";
               }
             }' *.ru.jp
    

    【讨论】:

    • 当然,当你写push $element => @list时会发生什么。哎呀,错了。小心粗逗号。
    【解决方案2】:

    您可以使用 Perl 的文件 glob 和内置的rename 函数,如下所示:

    use warnings;
    use strict;
    
    my $i = 1;
    for (<*.ru.jp>) {
        my $file = $_;
        s/\.ru\.jp$//;
        my $new = $_ . 't'. $i . '.ru.jp';
        rename $file, $new or die "Can not rename $file as $new: $!";
        $i++;
    }
    

    【讨论】:

      【解决方案3】:

      我试过这个,它似乎可以完成这项工作:

      #! /usr/bin/perl
      
      my $count = 0;
      for (<*.ru.jp>)
      {
              $count++;
              /(.+)\.ru\.jp/;
              rename $_, $1 . "t" . $count . ".ru.jp";
      }
      

      【讨论】:

      • 永远不要无条件地使用捕获变量($1$2,等等)!在匹配后使用 &amp;&amp; 而不是分号。是的,我意识到在这种特殊情况下似乎是在吹毛求疵,但养成这种习惯会让你免于追逐棘手的错误。
      • 感谢您的建议 :) 那么,您宁愿看到这样的内容吗?: /(.+)\.ru\.jp/ && rename $_, $1 。 “吨”。 $计数。 ".ru.jp";
      • 是的,或者可以通过将重命名放在前面来强调重命名:rename ... if /(.+)\.ru\.jp/。两者都忽略从rename 返回的值,因此任何失败都将是危险的沉默。你可以写/.../ &amp;&amp; (rename ... || warn ...);,但这似乎有点可爱。另一个需要养成的重要习惯是经常检查系统调用的返回值,例如renameopenunlink等。即使printclose也可能失败,所以在写重要位时检查它们.
      【解决方案4】:
      $count = 1;
      for (<*.ru.jp>)
      {
              ($filename)=(/^(.*?)\.ru.jp$/);
              rename $_,$filename."t".$count++.".ru.jp";
      }
      

      【讨论】:

        【解决方案5】:
        use strict;
        my $c=0;
        rename("$1.ru.jp", "$1" . $c++ . ".ru.jp") while <*.ru.jp> =~ /(.+).ru.jp/;
        

        【讨论】:

        • 好用严格;也会使用警告。
        【解决方案6】:
        my $counter=0;
        while(my $file=<*.ru.jp>){
            $counter++;
            my ($front,$back) = split /\./,$file,2;
            $newname="$front$counter".".t."."$back\n";
            rename $file $newname;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-01-08
          • 1970-01-01
          • 2019-06-27
          • 2014-01-30
          • 2021-09-14
          • 2012-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多