【问题标题】:Script or command to increment number in file name inside file用于在文件内增加文件名中的数字的脚本或命令
【发布时间】:2015-12-25 18:50:34
【问题描述】:

我有一个文件,其中有以下格式的条目。我想增加这个文件中文件名中的数字。所以some_v1.png 会变成some_v2.png。有没有办法使用正则表达式或命令行实用程序来实现这一点。

以下是示例文件 (file.config),文件条目为字符串。

something/some_v1.png
something/some_v4.png
something/some_v3.png

【问题讨论】:

  • 如果您要重命名(移动)文件,请注意不要在执行此操作时覆盖现有文件!
  • 可以用 perl perl -i -p -e 's/(\d+)/$1 + 1/eg' 文件名来完成 谢谢帮助
  • 为什么不使用for循环并像for i in {1..5}; do echo 'something/some_v'$i ; done一样做@
  • @PruthviRaj 无法执行此操作,因为数字不按顺序排列。一些文件条目已经在更高版本上
  • @AnilNamde ,你的问题说increment :)

标签: regex bash perl unix


【解决方案1】:

这看起来很适合 awk 的“拆分”功能:

awk '{n=split($0,a,"[1-9][0-9]*",s);for(i=1;i<n;++i)printf "%s%d",a[i],s[i]+1;print a[n]}'

您已经找到的 perl one-liner 也很有效,但有一个例外:带有前导零数字的文件将丢失零。这是使用神奇的自动增量的解决方法:

perl -pe 's/(\d+)/++($a=$1)/eg'

【讨论】:

    【解决方案2】:

    如果你想重命名一堆文件,我会使用辅助目录和测试来查看是否有要重命名的实际文件。

    mkdir aux
    for i in {1..7} ; do
        j=$($i + 1)
        [ -f something/some_v${i}.png ] && mv something/some_v${i}.png aux/some_v${j}.png
    done
    mv aux/* something
    rmdir aux
    

    辅助目录使用固定名称经不起在动态生产环境中重复使用的安全审查,但我认为在受控环境中一次性使用是可以的。

    【讨论】:

      【解决方案3】:

      perl:

      #!/usr/bin/env perl
      use strict;
      use warnings;
      
      foreach
          my $filename ( 
          sort { $b =~ s/.*(\d+).*/$1/r <=> $a =~ s/.*(\d+).*/$1/r }
          glob "something/some_v*.png" )
      {
          chomp $filename;
          if ( my ($vnum) = $filename =~ m/(\d+)\.png/ ) {
              print "mv $filename ", $filename =~ s|\d+\.png|++$vnum.".png"|re,
                  "\n";
          }
      }
      

      注意 - 按数字排序,以确保在重命名 5 之前不会将 5 替换为 4。

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 1970-01-01
        • 2012-04-13
        • 1970-01-01
        • 2021-10-05
        • 2016-10-18
        • 2012-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多