Как я могу использовать File::Find для печати файлов с относительным путем только?

Я решил эту ошибку путем переперетаскивания за столом от проводника сервера до разработчика и восстановления.

5
задан brian d foy 10 November 2009 в 19:41
поделиться

2 ответа

Далее будет напечатан путь для всех файлов в $ 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;
13
ответ дан 18 December 2019 в 10:46
поделиться

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

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

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

3
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: