Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl轻松批量重命名文件?_Perl_File_Rename_Bulk - Fatal编程技术网

如何使用Perl轻松批量重命名文件?

如何使用Perl轻松批量重命名文件?,perl,file,rename,bulk,Perl,File,Rename,Bulk,我有很多要重命名的文件,我试图创建一个正则表达式来匹配它们,但即使我被困在这些文件中,它们的名称也如下所示: 文件名01 文件名100 文件名02 文件名03 等等,我想在小于100的任何文件后面添加一个“0”(零),如下所示: 文件名001 文件名100 文件名002 文件名003 我找到的最接近匹配它们的方法是使用这个find-type d | sort-r | grep'[1-9][0-9]$,但是我不知道如何替换它们。提前谢谢你能给我的任何帮助。我在CentOS上,如果这有什么帮助的话,

我有很多要重命名的文件,我试图创建一个正则表达式来匹配它们,但即使我被困在这些文件中,它们的名称也如下所示:

文件名01

文件名100

文件名02

文件名03

等等,我想在小于100的任何文件后面添加一个“0”(零),如下所示:

文件名001

文件名100

文件名002

文件名003

我找到的最接近匹配它们的方法是使用这个find-type d | sort-r | grep'[1-9][0-9]$,但是我不知道如何替换它们。提前谢谢你能给我的任何帮助。我在CentOS上,如果这有什么帮助的话,所有这些都是通过SSH完成的。

我想这是你的朋友

find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 
或者类似的,只要

  • 您有GNU find和GNU xargs(用于
    -print0
    -0
  • 您有perl附带的“重命名”实用程序
  • 文件名中只有一组数字。如果有多个,那么您需要对正则表达式进行一些处理,使其仅与您要重新格式化的数字匹配

  • 按以下顺序运行两个命令:

    $ rename 's/File Name (\d)$/File Name 0$1/' *
    $ rename 's/File Name (\d\d)$/File Name 0$1/' *
    

    第一个将所有小于10的项重命名,并在前面加上零。第二个函数重命名小于100的所有对象,并在前面加上零。结果应该是所有文件名的三位数字。

    您可以使用perl或ruby做一些事情

    将所有这些文件放在同一目录中

    dirlisting = DIR.entries('.')
    
    dirListing.each do |file| 
     num = file.match(/\d+$/).to_i
     if num < 100
       find the position where start the number, with index and inject the 0 there.
     end
    end
    
    dirlisting=DIR.entries('.'))
    dirListing.each do|file|
    num=file.match(/\d+$/)。到\u i
    如果num<100
    找到开始编号的位置,使用索引并将0插入该位置。
    结束
    结束
    
    这是一次性的吗?如果是这样的话,我将提出一些可能被许多程序员所回避的建议:

    通过管道将命令的输出(
    find-typed | sort-r | grep'[1-9][0-9]$'
    )传输到一个文件,并使用编辑器和一些全局搜索/替换魔术创建一个执行重命名的脚本

    然后扔掉剧本

    通过尝试一个聪明的(但调试不充分的)一行程序进入你文件中的杂草中,你不会大惊小怪,也不太可能最终击中自己的脚

    perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
    

    可能有点过头了,但它做到了要求的。在我的debian中,它可以很好地使用rename,并用300个文件进行了测试

    use strict;
    use File::Copy;
    
    my @files = glob 'File*Name*';
    
    foreach my $filename (@files) {
        if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
            my $number = $1;
            next if ($number > 99);
            rename $filename, sprintf("FileName%03d",$number);
        }
    }
    
     perl -e 'map `touch door$_.txt`, 1..300;'
     rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
    

    如果你的遥控器有bashshell

    for i in File*; 
    do 
        case "${i##* }" in  [0-9][0-9] ) 
          echo  mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
        esac; 
    done
    

    删除“echo”以进行实际重命名

    您的文件名是否包含空格?是的,它们看起来像:“文件名01”“文件名101”您能详细介绍一下机器上可用的“工具”吗?您是否安装了perl、python、ruby或类似的软件?您能否澄清您试图匹配的文件名是什么,以及您试图避免匹配的文件名是什么?我在这里有点困惑。Perl(5.8.8)在机器上,但是python和ruby不是,我很熟悉,可以通过yum进行安装,如果需要的话。您可能应该提到这段代码是ruby,而不是perlAnd,这就是为什么我说您应该消除代码是ruby这一事实的歧义。这接近于我要建议的内容,使用sed而不是xargs,所以我将+1它。我知道xargs是一种方法,但我无法编写确切的命令。+1用于列出依赖项(您所指的重命名实用程序可能是一个yum或apt-way)。我一直对cygwin perl发行版不包含rename感到愤怒。++!有时,使用你理解的乱七八糟的东西比学习“深层魔法”要好。+1我认为这类东西通常是一次性需求的最实用的解决方案。这可能是一种逃避,但它是一种安全的逃避……值得称赞。在vim中可能的全局搜索和替换魔法是
    :s/^\(.*)\(\d\d\)$/mv\1\10\2/
    在Emacs中,您可以打开目录列表,按C-x C-q,编辑缓冲区中的文件名(例如,使用搜索和替换或任何其他命令),保存后Emacs将重命名文件。
    rename
    是标准perl发行版附带的实用程序。我在Linux Bash下运行了这些。它将
    文件名100
    重命名为
    文件名0100
    ,这是无意的。你肯定是对的。添加了一些代码,这样就不会发生这种情况。