Как я могу использовать File :: Find для печати файлов только с относительным путем? - PullRequest
5 голосов
/ 10 ноября 2009

Я использую File :: Find в коде ниже, чтобы найти файлы из /home/user/data path.

use File::Find;

my $path = "/home/user/data";
chdir($path);
my @files;

find(\&d, "$path");

foreach my $file (@files) {
print "$file\n";
}

sub d {
-f and -r and push  @files, $File::Find::name;
}

Поскольку я меняю путь dir на путь, из которого мне нужно искать файлы, но все равно он дает мне файлы с полным путем. т.е.

/home/user/data/dir1/file1
/home/user/data/dir2/file2
and so on...

но я хочу вывод как

dir1/file1
dir2/file2
and so on...

Может кто-нибудь предложить мне код для поиска файлов и отображения только из текущего рабочего каталога?

Ответы [ 2 ]

13 голосов
/ 10 ноября 2009

Ниже будет напечатан путь для всех файлов в $base относительно $base (не в текущем каталоге):

#!/usr/bin/perl
use warnings;
use strict;

use File::Spec;
use File::Find;

# can be absolute or relative (to the current directory)
my $base = '/base/directory';
my @absolute;

find({
    wanted   => sub { push @absolute, $_ if -f and -r },
    no_chdir => 1,
}, $base);

my @relative = map { File::Spec->abs2rel($_, $base) } @absolute;
print $_, "\n" for @relative;
3 голосов
/ 10 ноября 2009

Как насчет просто удалить его:

foreach my $file (@files) {
$file =~ s:^\Q$path/::;
print "$file\n";
}

Примечание: это фактически изменит содержание @files.

Согласно комментариям это не работает, поэтому давайте протестируем полную программу:

#!/usr/local/bin/perl
use warnings;
use strict;
use File::Find;

my $path = "/usr/share/skel";
chdir($path);
my @files;

find(\&d, "$path");

foreach my $file (@files) {
$file =~ s:^\Q$path/::;
print "$file\n";
}

sub d {
-f and -r and push  @files, $File::Find::name;
}

Я получаю вывод

$ ./find.pl
dot.cshrc
dot.login
dot.login_conf
dot.mailrc
dot.profile
dot.shrc

Мне кажется, это работает нормально. Я также проверил это с каталогами с подкаталогами, и нет никаких проблем.

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