【问题标题】:file organisation in windows using perl使用 perl 在 windows 中组织文件
【发布时间】:2016-12-03 12:01:14
【问题描述】:

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

每个文件名由{a string A}{2 or 3 digit number B}{single letter "r" or "x"}{3 digit number}.extension

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

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

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

所以它最终会看起来像

/CustomerA/1
/CustomerA/2
/CustomerA/3
/CustomerB/1
/CustomerB/2
/CustomerB/3

等每个子文件夹中的文件

所以 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: $!";
}

【问题讨论】:

  • 您必须展示您尝试过的程序,我们才能帮助您修复它
  • 为了便于阅读,我编辑了您问题中的代码以添加一些缩进和空行。如果您不喜欢,请回滚——点击“edited ...”(在用户名上方),然后点击之前的“rollback”版本。
  • 太好了,谢谢。我编写的代码中有空行和更大的缩进,但是当我将其作为注释粘贴时,格式有点梨形,所以我删除了空行,认为这会导致格式问题。再次,非常感谢。

标签: windows perl file directory


【解决方案1】:

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

my ($cust, $num) = $filename =~ m/(\D+)(\d+)/;

如果您希望或需要更具体地说明数字前面的内容,请使用更精确的模式,例如 [a-zA-Z] 仅用于字母。

有了这些,您可以使用核心模块File::Path 创建目录,例如

use File::Path qw(make_path);
my $dirname = "$cust/$num";
my @dirs_made = make_path($dirname, { verbose => 1 });

这会根据需要创建路径,并返回创建的目录的名称。它还打印带有verbose 的名称。如果目录存在,它会悄悄地跳过它。如果有问题,它会引发die,因此您可能希望将其包装在eval

eval { make_path($dirname) };
if ($@) { 
    warn "Error with make_path($dirname): $@";
}

还要注意File::Path::Tiny 模块作为替代,感谢Sinan Ünür 提出它。除了更轻巧之外,它还具有更常见的错误处理策略,即在失败时返回 false,因此您不需要 eval 而只需要通常的检查

use File::Path::Tiny;
File::Path::Tiny::mk($path) or warn "Can't mk($path): $!";

该模块在许多方面的行为类似于mkdir,请参阅链接文档。

例如,使用move 函数将文件从核心模块File::Copy 中移出

use File::Copy qw(move);
move($file, $dirname)  or warn "Can't move $file to $dirname: $!";

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

【讨论】:

  • make_path 真的会因为失败而死吗?
  • @Borodin 是的,我相信。我总是eval它,我现在在cmdline上尝试了。
  • @Borodin 我试图在/ 中创建正确的路径,我没有权限(并且单行的其余部分没有执行)。当我eval 它时,我得到mkdir /new_dir: Permission denied
  • @Borodin 是的,完全同意。我是通过被咬来了解它的。但我对替代品的了解还不够(而且对我来说它总是在一个小图书馆里)。
  • 你可以使用File::Path::Tiny
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 2010-10-22
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多