如何使用perl在工作目录中获取子文件夹名称?

时间:2015-03-07 19:52:14

标签: perl

我在主文件夹中有几个子文件夹。我的程序将在每个子文件夹中进行一些计算。首先,代码将在主文件夹中为所有计算创建“result”文件夹。并且,为了计算每个子文件夹,我想在“result”文件夹中创建一个文件夹。但它们的名称应与子文件夹相同。

我的工作目录是“/ home / abc / Desktop / test”。 “测试”是我的主文件夹。 “test”文件夹中有“a”,“b”和“c”子文件夹。我的代码在“test”主文件夹中创建“result”文件夹。但它也应该在“result”文件夹中创建“a”,“b”和“c”子文件夹。我该如何修复我的代码?

#!/usr/bin/env perl
use strict;
use warnings; 
use File::Path qw/make_path/;
use Cwd;

my $dir     = cwd();

opendir (DIR, $dir) or die "Unable to open current directory! $!\n";
my @subdirs = readdir (DIR) or die "Unable to read directory! $!\n";
closedir DIR;

my $result_path = "$dir/results";
make_path("$result_path");

foreach my $subdir ( sort @subdirs ) {

chdir($subdir) or die "Cannot cd to $dir: $!\n";

make_path("$result_path/$subdir");

 system("echo '1 0' | program -f data.mol -o $result_path/$subdir outfile.txt");

chdir("..");

}

2 个答案:

答案 0 :(得分:1)

File::Find::Rule->directory->in( $dir );

以起点$dir递归地查找目录树中的所有目录。对于它找到的每个目录,您将获取基本名称。

因此,当遇到$dir/test/a时,basename的{​​{1}}就是a,您的代码就会继续并创建result/a

我怀疑你不需要在树中找到所有目录 - 但鉴于你的问题描述混乱,不容易确定。

也许您只想opendir目录,readdir所有条目只保留...以及closedir以外的目录。完成而不是遍历$dir下的整个树。

答案 1 :(得分:1)

我不认为File::Find::Rule是解决这个问题的好选择。该模块的专业是递归搜索目录树,在这里你只需要一个文件夹中的所有目录的列表。这可以通过grep -d, glob '*'

完成

这是根据File::chdir使用previous question模块的版本。它避免了CwdFile::Basename的需要,它允许您本地化当前工作目录,以便在每个循环结束时不需要chdir '..'

use strict;
use warnings; 

use File::chdir;

my @folders = grep -d, glob '*';

my $result_path = "$CWD/result";
mkdir $result_path;

for my $folder ( @folders ) {
  my $result_folder = "$result_path/$folder";
  mkdir $result_folder;
  local $CWD = $folder;
  system("echo '1 0' | program -f data.mol -o $result_folder/output.txt");
}
相关问题