Есть ли в Perl функция, которая перечисляет все файлы и каталоги в каталоге?
Я помню, что Java имеет File.list()
для этого? Есть ли сопоставимый метод в Perl?
Как я могу перечислить все файлы в каталоге с Perl?
Ответ 1
Если вы хотите получить содержимое данной директории и только это (т.е. нет подкаталогов), лучший способ - использовать opendir/readdir/closedir:
opendir my $dir, "/some/path" or die "Cannot open directory: $!";
my @files = readdir $dir;
closedir $dir;
Вы также можете использовать:
my @files = glob( $dir . '/*' );
Но, на мой взгляд, это не так хорошо - в основном потому, что glob - довольно сложная вещь (может автоматически фильтровать результаты автоматически), и использование этого для получения всех элементов каталога кажется слишком простой задачей.
С другой стороны, если вам нужно получить контент из всех каталогов и подкаталогов, есть в основном одно стандартное решение:
use File::Find;
my @content;
find( \&wanted, '/some/path');
do_something_with( @content );
exit;
sub wanted {
push @content, $File::Find::name;
return;
}
Ответ 2
Или Файл:: Найти
use File::Find;
finddepth(\&wanted, '/some/path/to/dir');
sub wanted { print };
Он будет проходить через подкаталоги, если они существуют.
Ответ 3
readdir() делает это.
Проверить http://perldoc.perl.org/functions/readdir.html
opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
closedir DIR;
Ответ 4
это должно сделать это.
my $dir = "bla/bla/upload";
opendir DIR,$dir;
my @dir = readdir(DIR);
close DIR;
foreach(@dir){
if (-f $dir . "/" . $_ ){
print $_," : file\n";
}elsif(-d $dir . "/" . $_){
print $_," : folder\n";
}else{
print $_," : other\n";
}
}
Ответ 5
Если вы неаккураторы, подобные мне, вы можете использовать модуль File::Slurp. Функция read_dir будет считывать содержимое каталога в массив, удаляет точки и при необходимости префикс файлов, возвращаемых с помощью dir для абсолютных путей
my @paths = read_dir( '/path/to/dir', prefix => 1 ) ;
Ответ 6
Здесь будут перечислены все (включая вспомогательные каталоги) из указанного вами каталога в порядке и с атрибутами. Я потратил дни на то, чтобы что-то сделать, и я принял участие в этом обсуждении, и немного о себе, и собрал его. НАСЛАЖДАЙТЕСЬ!!
#!/usr/bin/perl --
print qq~Content-type: text/html\n\n~;
print qq~<font face="arial" size="2">~;
use File::Find;
# find( \&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line
find( \&wanted_tom, '/home');
exit;
sub wanted_tom {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_);
$mode = (stat($_))[2];
$mode = substr(sprintf("%03lo", $mode), -3);
if (-d $File::Find::name) {
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>";
} else {
print "$File::Find::name --ATTR:$mode<br>";
}
return;
}