2015-12-17 67 views
0

我想在没有“。”的情况下获取第一级目录中的子目录列表。和“..”在例如dir“/ var /”。我有这样的perl脚本,但它不工作:无法在第一级上列出目录中的子目录

#!/bin/perl 

opendir(my $DH, $ARGV[0]) || die "$!\n"; 
    my @dirs 
    = grep { 
     -d "$_" && 
     /[^.]/ 
    } readdir($DH); 
    @dirs = sort(@dirs); 

closedir $DH; 

print "@dirs\n"; 

输出是:

$ ./_copyplg.pl /var 
<nothing> 

/VAR名单

$ ls -1a /var 
. 
.. 
adm 
cache 
crash 
db 
empty 
lib 
local 
lock 
log 
lost+found 
mail 
run 
spool 
tmp 
var 
www 

请在这里我犯的错误?

回答

2

您是说$_是一个目录,$_包含不点任何角色的至少一个”在你grep。您需要在正则表达式中跳过.

如果您只是否定匹配,则不需要字符类[]。将字符串的起始点设置为也是有意义的,并且确保只获取...,因为您可能希望稍后允许包含点的目录,或者甚至以点开头,例如/var/.foo/已验证。

my $dir = $ARGV[0]; 
my @dirs = grep { ! /^\.\.?\z/ && -d "$dir/$_" } readdir $DH; 

现在将匹配...,但没有别的,而否定的。

注意如何将目录添加到-d检查,因为readdir只返回文件名,而不是它们的完整路径。因为您没有从$dir开始该程序,而且您也没有切换当前目录,所以需要这样做。

如果您打算测试readdir, 的返回值,那么最好预先考虑目录。否则,因为我们 没有chdir那里,它会测试错误的文件。

退房的perldoc on readdir,因为这包括了如何筛选出...实际的例子,以及有关文件名的警告。


你应该在你的Perl程序use strictuse warnings 'all'。它不会帮助你在这种情况下找到问题,但它会让你的生活更轻松。

+0

谢谢@ikegami,忘记那部分 – simbabque

+0

你说得对,我缺少严格的警告使用。我把它填充到脚本。 但我用你的“grep”取代了我的“grep”,但它不起作用**。 – waldauf

+1

@waldauf“它不起作用”是什么意思? –