2009-11-10 4 views
4

J'utilise File::Find dans le code ci-dessous pour trouver les fichiers de /home/user/data path.Comment utiliser File :: Find pour imprimer des fichiers avec le chemin relatif uniquement?

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; 
} 

Comme je change le chemin dir sur le chemin où je dois rechercher les fichiers mais il me donne les fichiers avec le chemin complet. à savoir

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

mais je veux la sortie comme

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

Quelqu'un peut-il s'il vous plaît me suggérer le code pour trouver les fichiers et l'affichage à partir du répertoire de travail courant seulement?

Répondre

12

Ce qui suit imprimer le chemin de tous les fichiers sous $base, par rapport à $base (pas le répertoire en cours):

#!/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; 
+1

+1 pour la promotion de 'File :: Spec' –

3

Que diriez-vous simplement enlever:

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

Note: cela fait modifier le contenu de @files.

Selon les commentaires cela ne fonctionne pas, donc nous allons tester un programme complet:

#!/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; 
} 

La sortie que je reçois est

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

Cela semble fonctionner OK pour moi. Je l'ai également testé avec des répertoires avec des sous-répertoires, et il n'y a pas de problème.

+0

Merci, mais ce ne fonctionne pas pour moi. Toujours obtenir le chemin complet. – Space

+1

Ça marche pour moi. Etes-vous sûr que vous avez tout copié correctement? –

+0

Oui, j'ai copié et collé mais il donne le chemin complet de /. – Space

Questions connexes