Как я могу отличить файл от каталога в Perl? - PullRequest
18 голосов
/ 16 октября 2008

Я пытаюсь пройти через все подкаталоги текущего каталога в Perl и получить данные из этих файлов. Я использую grep, чтобы получить список всех файлов и папок в данном каталоге, но я не знаю, какое из возвращенных значений является именем папки, а какое - файлом без расширения файла.

Как я могу определить разницу?

Ответы [ 6 ]

30 голосов
/ 16 октября 2008

Вы можете использовать оператор проверки файлов -d , чтобы проверить, является ли каталог каталогом. Вот некоторые из наиболее полезных операторов проверки файлов

    -e  File exists.
    -z  File has zero size (is empty).
    -s  File has nonzero size (returns size in bytes).
    -f  File is a plain file.
    -d  File is a directory.
    -l  File is a symbolic link.

Подробнее см. perlfunc

Также попробуйте использовать File :: Find , который может найти каталоги для вас. Вот пример, который ищет каталоги ....

sub wanted {
     if (-d) { 
         print $File::Find::name." is a directory\n";
     }
}

find(\&wanted, $mydir);
21 голосов
/ 16 октября 2008
print "$file is a directory\n" if ( -d $file );
10 голосов
/ 16 октября 2008

Посмотрите на операторы -X:

perldoc -f -X

Для обхода каталога используйте File :: Find или, если вы не мазохист, используйте мой модуль File :: Next, который делает для вас итератор и не требует сумасшедших обратных вызовов. Фактически, вы можете заставить File :: Next ТОЛЬКО возвращать файлы и игнорировать каталоги.

use File::Next;

my $iterator = File::Next::files( '/tmp' );

while ( defined ( my $file = $iterator->() ) ) {
    print $file, "\n";
}

# Prints...
/tmp/foo.txt
/tmp/bar.pl
/tmp/baz/1
/tmp/baz/2.txt
/tmp/baz/wango/tango/purple.txt

Это на http://metacpan.org/pod/File::Next

5 голосов
/ 21 октября 2008
my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
4 голосов
/ 16 октября 2008
my $dh = opendir(".");
my @entries = grep !/^\.\.?$/, readdir($dh);
closedir $dh;

foreach my $entry (@entries) {
    if(-f $entry) {
        # $entry is a file
    } elsif (-d $entry) {
        # $entry is a directory
    }
}
2 голосов
/ 16 октября 2008

Было бы проще использовать File::Find.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...