我在主文件夹中有几个子文件夹。我的程序将在每个子文件夹中进行一些计算。首先,代码将在主文件夹中为所有计算创建“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("..");
}
答案 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模块的版本。它避免了Cwd
和File::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");
}