Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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在windows中组织文件_Windows_Perl_File_Directory - Fatal编程技术网

使用perl在windows中组织文件

使用perl在windows中组织文件,windows,perl,file,directory,Windows,Perl,File,Directory,我在一台windows机器上工作,我有一个目录,里面有大约200k的文件,我需要整理这些文件。这是一项我需要经常使用不同文件名集但模式相似的工作,因此perl似乎是一个很好的工具 每个文件名由{字符串a}{2或3位数字B}{单个字母“r”或“x”}{3位数字}组成。扩展名 我想为每个字符串创建一个文件夹 在每个文件夹中,我希望每个B都有一个子文件夹 然后,我想将每个文件移动到其相关的子文件夹中 所以它最终会看起来像 /CustomerA/1 /CustomerA/2 /CustomerA/3 /

我在一台windows机器上工作,我有一个目录,里面有大约200k的文件,我需要整理这些文件。这是一项我需要经常使用不同文件名集但模式相似的工作,因此perl似乎是一个很好的工具

每个文件名由{字符串a}{2或3位数字B}{单个字母“r”或“x”}{3位数字}组成。扩展名

我想为每个字符串创建一个文件夹

在每个文件夹中,我希望每个B都有一个子文件夹

然后,我想将每个文件移动到其相关的子文件夹中

所以它最终会看起来像

/CustomerA/1
/CustomerA/2
/CustomerA/3
/CustomerB/1
/CustomerB/2
/CustomerB/3
etc和每个子文件夹中的文件

因此CustomerA888x123.xml被移动到/CustomerA/888中/

我有一个数组中的文件列表,但我正在努力将文件名拆分为其组成部分,并有效地使用这些部分

谢谢你的回答。我的结局是:

#!usr/bin/perl
use warnings;
use strict;
use File::Copy qw(move);
use File::Path qw(make_path);

opendir my $dir, ".";
my @files = readdir($dir);
closedir $dir;

foreach my $file (@files) {
    my ($cust, $num) = $file =~ m/(\D+)(\d+)/;
    my $dirname = "$cust/$num";
    my @dirs_made = make_path($dirname, { verbose => 1 });
    move($file, $dirname) or warn "cant move $file to $dirname: $!";
}

根据您对文件名的描述,这个正则表达式应该解析您需要的内容

my ($cust, $num) = $filename =~ m/(\D+)(\d+)/;
如果您希望或需要更具体地说明数字前面的内容,请使用更精确的模式,例如
[a-zA-Z]
仅适用于字母

有了它,您可以使用核心模块创建目录,例如

use File::Path qw(make_path);
my $dirname = "$cust/$num";
my @dirs_made = make_path($dirname, { verbose => 1 });
use File::Copy qw(move);
move($file, $dirname)  or warn "Can't move $file to $dirname: $!";
这将根据需要创建路径,返回已创建目录的名称。它还使用
verbose
打印名称。如果目录存在,它会悄悄地跳过它。如果有问题,它会引发一个问题,因此您可能希望将其打包

还请注意,模块是一个备选模块,感谢您提出它。除了要轻得多之外,它还有更常见的错误处理策略,即在失败时返回false,因此您不需要
eval
,只需要常规检查

use File::Path::Tiny;
File::Path::Tiny::mk($path) or warn "Can't mk($path): $!";
该模块的行为在许多方面与类似,请参阅链接文档

例如,使用
Move
功能从核心模块移动文件

use File::Path qw(make_path);
my $dirname = "$cust/$num";
my @dirs_made = make_path($dirname, { verbose => 1 });
use File::Copy qw(move);
move($file, $dirname)  or warn "Can't move $file to $dirname: $!";

所有这些都可以在带有文件名的数组上循环。

根据您对文件名的描述,这个正则表达式应该解析您需要的内容

my ($cust, $num) = $filename =~ m/(\D+)(\d+)/;
如果您希望或需要更具体地说明数字前面的内容,请使用更精确的模式,例如
[a-zA-Z]
仅适用于字母

有了它,您可以使用核心模块创建目录,例如

use File::Path qw(make_path);
my $dirname = "$cust/$num";
my @dirs_made = make_path($dirname, { verbose => 1 });
use File::Copy qw(move);
move($file, $dirname)  or warn "Can't move $file to $dirname: $!";
这将根据需要创建路径,返回已创建目录的名称。它还使用
verbose
打印名称。如果目录存在,它会悄悄地跳过它。如果有问题,它会引发一个问题,因此您可能希望将其打包

还请注意,模块是一个备选模块,感谢您提出它。除了要轻得多之外,它还有更常见的错误处理策略,即在失败时返回false,因此您不需要
eval
,只需要常规检查

use File::Path::Tiny;
File::Path::Tiny::mk($path) or warn "Can't mk($path): $!";
该模块的行为在许多方面与类似,请参阅链接文档

例如,使用
Move
功能从核心模块移动文件

use File::Path qw(make_path);
my $dirname = "$cust/$num";
my @dirs_made = make_path($dirname, { verbose => 1 });
use File::Copy qw(move);
move($file, $dirname)  or warn "Can't move $file to $dirname: $!";

所有这些都可以在带有文件名的数组上循环。

在我们帮助您修复itI之前,您必须显示您尝试过的程序。为了可读性,我编辑了您问题中的代码,添加了一些缩进和空行。如果您不喜欢,请回滚--单击“编辑…”(用户名上方),然后单击上一版本下的“回滚”。太好了,谢谢。我写的代码中有空行和更大的缩进,但当我将其粘贴为注释时,格式有点梨形,所以我删除了空行,认为这是造成格式问题的原因。再次,非常感谢。在我们帮助您修复itI之前,您必须展示您尝试过的程序。为了可读性,我编辑了您问题中的代码,添加了一些缩进和空行。如果您不喜欢,请回滚--单击“编辑…”(用户名上方),然后单击上一版本下的“回滚”。太好了,谢谢。我写的代码中有空行和更大的缩进,但当我将其粘贴为注释时,格式有点梨形,所以我删除了空行,认为这是造成格式问题的原因。再一次,非常感谢。
真的会让你的路径在失败中死去吗?@Borodin是的,我相信会。我总是
eval
它,现在我在cmdline上进行了尝试。@Borodin我试图在
/
中设置正确的路径,对此我没有权限(并且一行代码的其余部分没有执行)。当我
eval
它时,我得到
mkdir/new\u dir:权限被拒绝
@Borodin是的,完全同意。我是通过被咬才知道的。但我对其他选择的了解还不够(对我来说,它总是在一个小图书馆里)。你可以用
make_path
真的在失败时死去吗?@Borodin是的,我相信是这样。我总是
eval
它,现在我在cmdline上进行了尝试。@Borodin我试图在
/
中设置正确的路径,对此我没有权限(并且一行代码的其余部分没有执行)。当我
eval
它时,我得到
mkdir/new\u dir:权限被拒绝
@Borodin是的,完全同意。我是通过被咬才知道的。但我对其他选择知道的还不够多(我总是把它放在一个小图书馆里)