使用perl在windows中组织文件
我在一台windows机器上工作,我有一个目录,里面有大约200k的文件,我需要整理这些文件。这是一项我需要经常使用不同文件名集但模式相似的工作,因此perl似乎是一个很好的工具 每个文件名由{字符串a}{2或3位数字B}{单个字母“r”或“x”}{3位数字}组成。扩展名 我想为每个字符串创建一个文件夹 在每个文件夹中,我希望每个B都有一个子文件夹 然后,我想将每个文件移动到其相关的子文件夹中 所以它最终会看起来像使用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 /
/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是的,完全同意。我是通过被咬才知道的。但我对其他选择知道的还不够多(我总是把它放在一个小图书馆里)