Ich bin ein wenig verwirrt von File::Find
Dokumentation ... Was ist das Äquivalent zu $ find my_dir -maxdepth 2 -name "*.txt"
?Wie kann ich File :: Find in Perl verwenden?
Antwort
Persönlich bevorzuge ich File::Find::Rule
, da Sie keine Callback-Routinen erstellen müssen.
use strict;
use Data::Dumper;
use File::Find::Rule;
my $dir = shift;
my $level = shift // 2;
my @files = File::Find::Rule->file()
->name("*.txt")
->maxdepth($level)
->in($dir);
print Dumper(\@files);
Oder alternativ einen Iterator erstellen:
my $ffr_obj = File::Find::Rule->file()
->name("*.txt")
->maxdepth($level)
->start($dir);
while (my $file = $ffr_obj->match())
{
print "$file\n"
}
+1 Ich denke, das ist die einfachste, die meisten '$ find'-ähnliche Lösung vorgeschlagen. –
leider mit Iterator, holt es alle Verzeichnisstruktur in den Speicher. Wenn die Struktur so groß (typisch) ist, wird der Prozess viel Speicher verbrauchen. Deshalb ist diese Entschließung oft nicht gut. Im Gegensatz dazu bietet scannind dir tree by system find-Befehl eine Option zum Online-Abruf, ohne viel RAM zu verbrauchen. – Znik
Ich glaube, ich nur ein glob
verwenden würde, da Sie wirklich alle Sachen, die Directory-Traversal nicht brauchen:
my @files = glob('*.txt */*.txt');
ich File::Find::Closures gemacht, um es einfach für Sie, die Rückrufe zu erstellen, die Sie weitergeben zu find
:
use File::Find::Closures qw(find_by_regex);
use File::Find qw(find);
my($wanted, $reporter) = File::Find::Closures::find_by_regex(qr/\.txt\z/);
find($wanted, @dirs);
my @files = $reporter->();
Normalerweise können Sie eine Such drehen (1) Befehl in ein Perl-Programm mit find2perl
(in V5.20 entfernt, aber auf CPAN):
% find2perl my_dir -d 2 -name "*.txt"
Aber anscheinend find2perl
versteht nicht -maxdepth
, so dass Sie, dass weg verlassen können:
% find2perl my_dir -name "*.txt"
#! /usr/local/perls/perl-5.13.5/bin/perl5.13.5 -w
eval 'exec /usr/local/perls/perl-5.13.5/bin/perl5.13.5 -S $0 ${1+"[email protected]"}'
if 0; #$running_under_some_shell
use strict;
use File::Find();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, 'my_dir');
exit;
sub wanted {
/^.*\.txt\z/s
&& print("$name\n");
}
Nun, da Sie die Start Programmierung haben, können Sie in stecken, was auch immer, was Sie brauchen, einschließlich einem preprocess
Schritt beschneide den Baum.
+1 Danke! gut zu finden über 'File :: Find :: Closures' –
use File::Find ;
use Cwd ;
my $currentWorkingDir = getcwd;
my @filesToRun =();
my $filePattern = '*.cmd' ;
#add only files of type filePattern recursively from the $currentWorkingDir
find(sub { push @filesToRun, $File::Find::name
if (m/^(.*)$filePattern$/) }, $currentWorkingDir) ;
foreach my $file (@filesToRun )
{
print "$file\n" ;
}
Danke - das ist genau das, was ich gesucht habe. – Winter
Es gibt auch das handliche find2perl Dienstprogramm. Verwenden Sie es anstelle des Befehls Unix find mit den gleichen Befehlszeilenargumenten wie 'find' und es wird der entsprechende Perl-Code generiert, der File :: Find verwendet.
$ find2perl my_dir -maxdepth 2 -name "*.txt"
- 1. Kann ich Emacs Find-File History ändern?
- 2. Wie kann ich das Ergebnis von File :: Find in html perl-Skript drucken?
- 3. Wie kann ich einen Parameter an die gewünschte Funktion übergeben, wenn Sie Perl's File :: Find verwenden?
- 4. Wie Konflikt mit Datei lösen :: Find :: Regel und File :: Find
- 5. Wie übergebe ich Parameter an das File :: Find-Unterprogramm, das jede Datei verarbeitet?
- 6. Wie kann ich jdee `find-class-source-file` konfigurieren, um mit Cassandra source tree zu arbeiten?
- 7. Wie kann ich File :: ChangeNotify unter Windows verwenden?
- 8. Wie sollte ich Perls File :: Temp verwenden?
- 9. Wie kann ich ein Modul in Perl bedingt verwenden?
- 10. Wie kann ich "s" als Ersatztrennzeichen in Perl verwenden?
- 11. Wie kann ich Integer beliebiger Länge in Perl verwenden?
- 12. Wie kann ich eine Variable als Modulname in Perl verwenden?
- 13. Wie kann ich eine Variable als Variablennamen in Perl verwenden?
- 14. Wie kann ich die Find-Befehle kombinieren?
- 15. JQuery "find()" mit Tiefenbegrenzung kann ich nicht verwenden. Children()
- 16. Wie kann ich eine C++ - Klasse von Perl verwenden?
- 17. Wie kann ich Perl-Bibliotheken von PHP verwenden?
- 18. Wie kann ich ein neues Perl-Modul ohne Installationsberechtigungen verwenden?
- 19. Wie kann ich Unix Grep in Perl implementieren?
- 20. Kann ich Perl CGI :: Sessions Daten in PHP verwenden?
- 21. Wie kann ich Introspektion in Perl durchführen?
- 22. Wie kann ich Daten in Perl validieren?
- 23. Wie kann ich Komponententests in Perl durchführen?
- 24. Wie kann ich Berechtigungen in Perl löschen?
- 25. Wie kann ich JSON in Perl parsen?
- 26. Wie kann ich Daten in Perl sortieren?
- 27. Wie kann ich Zeitzonen in Perl konvertieren?
- 28. Perl Funktioniert IO :: File mit Autodie?
- 29. Wie kann ich sbt.IO verwenden?
- 30. Kann ich ISAPI-Filter in Perl schreiben?
'mein @files = \' finden my_dir $ -maxdepth 2 -name * .txt \ ';' ... Ich habe nicht die 'Wanted' sub bekommen. Kann ich nicht einfach eine Regex geben? –
Eine andere Frage zu [Dateien mit Perl finden] (http://stackoverflow.com/questions/17754931/finding-files-with-perl) erwähnt einige Alternativen, die in den Antworten unten nicht erwähnt werden. –