将目录列表存储在数组中

时间:2016-06-13 09:44:55

标签: perl directory-structure

我收到了一个Perl脚本,该脚本当前从文本文件中读取目录列表并将它们存储在字符串向量中。我想修改它,以便它读取当前文件夹中所有目录的名称,并将它们存储在向量中。这样,每当当前文件夹中的目录列表发生更改时,用户就不必修改输入文件。

我不了解Perl,除了它看起来像Perl中的数组索引从0开始(如在Python中)。我对bash和Python有基本的了解,但我不想在Python中从头开始重写脚本。这是一个漫长而复杂的脚本,我不确定我是否能用Python重写它。你能帮助我吗?以下是当前正在读取文本文件的脚本部分:

#!/usr/bin/perl
use Cwd;
.
.
.
open FILES, "<files.txt" or die; # open input file
<FILES> or die;              # skip a comment
my $nof = <FILES> or die;    # number of directories
<FILES> or die;              # skip a comment
my @massflow;                # read directories
for (my $i = 0; $i < $nof; $i++){
    chomp($massflow[$i] = <FILES>);
}
. 
.
. 
close(FILES);
PS我认为脚本是不言自明的,但只是为了确定,这篇文章打开一个名为“files.txt”的文本文件,跳过一行,读取目录数,跳过另一行并读取,一个每行的名称,当前文件夹中所有目录的名称,写在“files.txt”中。

编辑我在@Sobrique建议之后编写了这个脚本,但它也列出了文件,而不仅仅是dirs:

#!/usr/bin/perl
use Cwd;

my @flow = glob ("*");

my $arrSize = @flow;
print $arrSize;
for (my $i = 0; $i < $arrSize; $i++){
    print $flow[$i], "\n";
}

3 个答案:

答案 0 :(得分:10)

这比你想象的要简单:

my @list_of_dirs = grep { -d } glob "/path/to/dirs/*"; 

如果您想按标准过滤 - 比如'它是一个目录',您可以:

@Entity
@Table(name="policy_action")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class PolicyAction {


  @Id
  @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genName")
  @SequenceGenerator(name="genName", sequenceName="yourSequenceNameInDatabase",initialValue=1,allocationSize=1)
  @Column(name="id")
  private int id;

答案 1 :(得分:2)

打开子目录所在的目录opendir,使用readdir读取其内容。使用文件测试-d过滤掉不是目录的所有内容,请参阅-X

my $rootdir = 'top-level-directory';
opendir my $dh, "$rootdir" or die "Can't open directory $rootdir: $!";
my @dirlist = grep { -d } map { "$rootdir/$_" } readdir ($dh);

由于readdir返回裸名称,我们需要在路径前添加。

答案 2 :(得分:0)

你也可以这样得到:

my @dir = `find . -type d`;

perl -e ' use strict; use warnings; use Data::Dumper; my @dir = `find . -type d`; print Dumper(\@dir);'

$VAR1 = [
          '.
',
          './.fonts
',
          './.mozilla
',
          './bin
',
          './.ssh
',
          './scripts
'
        ];