如何使用perl获得工作目录中的子文件夹名称?
我在主文件夹中有几个子文件夹。我的程序将在每个子文件夹中进行一些计算。首先,代码将在主文件夹中为所有计算创建“结果”文件夹。对于每个子文件夹中的计算,我想在“result”文件夹中创建一个文件夹。但它们应该与子文件夹同名 我的工作目录是“/home/abc/Desktop/test”。“测试”是我的主文件夹。“测试”文件夹中有“a”、“b”和“c”子文件夹。我的代码在“测试”主文件夹中创建“结果”文件夹。但它也应该在“结果”文件夹中创建“a”、“b”和“c”子文件夹。如何修复我的代码如何使用perl获得工作目录中的子文件夹名称?,perl,Perl,我在主文件夹中有几个子文件夹。我的程序将在每个子文件夹中进行一些计算。首先,代码将在主文件夹中为所有计算创建“结果”文件夹。对于每个子文件夹中的计算,我想在“result”文件夹中创建一个文件夹。但它们应该与子文件夹同名 我的工作目录是“/home/abc/Desktop/test”。“测试”是我的主文件夹。“测试”文件夹中有“a”、“b”和“c”子文件夹。我的代码在“测试”主文件夹中创建“结果”文件夹。但它也应该在“结果”文件夹中创建“a”、“b”和“c”子文件夹。如何修复我的代码 #!/us
#!/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("..");
}
以起始点$dir
沿目录树递归查找所有目录。对于它找到的每个目录,您都使用basename
因此,当它遇到$dir/test/a
时,它的basename
就是a
,并且您的代码继续创建result/a
我怀疑您不需要在一棵树中找到所有的目录——但是考虑到您混乱的问题描述,很难确定
也许你只想opendir
目录,readdir
所有条目只保留除
和以外的目录。
,以及closedir
,而不是遍历$dir下的整个树,我认为这不是解决这个问题的好选择。该模块的特点是递归搜索目录树,这里您只需要一个文件夹中所有目录的列表。使用grep-d,glob'*'
下面是一个版本,它根据您的需要使用该模块。它避免了对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");
}
更改代码后,我无法重现问题$folder
包含目录名。抱歉。那是个打字错误。我编辑了我的代码。但是它没有给出我想要的。好吧,给出的代码没有任何作用。你如何检查结果?错误可能在那里,而不是在这里。我打印它来筛选它。将它添加到问题中的代码中。谢谢。但是您的代码在“result”文件夹中创建了“a”、“b”、“c”和“result”文件夹。@perlselami:好的,修复了。现在,在创建结果之前,它将获得子目录列表。我希望您能用清晰简洁的问题描述更新您的问题。我希望@Borodin没有给你鱼,因为现在你没有动力去解决你的问题。谢谢@Sinan,我更新了我的问题和代码。我怎样才能修好它?
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");
}