Estoy un poco confundido de la documentación File::Find
... ¿Cuál es el equivalente a $ find my_dir -maxdepth 2 -name "*.txt"
?¿Cómo puedo usar File :: Find in Perl?
Respuesta
Personalmente, prefiero File::Find::Rule
ya que no es necesario que cree rutinas de devolución de llamada.
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);
O, alternativamente, crear un iterador:
my $ffr_obj = File::Find::Rule->file()
->name("*.txt")
->maxdepth($level)
->start($dir);
while (my $file = $ffr_obj->match())
{
print "$file\n"
}
+1 Creo que esta es la solución más simple, más' $ find' -like sugerida. –
desafortunadamente con el iterador, recupera toda la estructura del directorio en la memoria. cuando la estructura es tan grande (típica), el proceso consumirá mucha memoria. Es por eso que esta resolución a menudo no es buena. En sentido opuesto, Scannind dir tree por el comando system find da la opción de ir a buscarlo en línea sin consumir gran cantidad de RAM. – Znik
Creo que sólo haría uso de un glob
ya que realmente no necesita todas las cosas recorrido de directorios:
my @files = glob('*.txt */*.txt');
hice File::Find::Closures para hacer más fácil para usted para crear las devoluciones de llamada que se pasan a 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->();
Normalmente, puede activar un (1) comando find en un programa de Perl con find2perl
(eliminado en v5.20 pero en CPAN):
% find2perl my_dir -d 2 -name "*.txt"
Pero al parecer no entiende find2perl
-maxdepth
, por lo que podría dejar que fuera:
% 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");
}
Ahora que ha de comenzar la programación, se puede conectar en cualquier otra cosa que necesita, incluyendo un paso a preprocess
podar el árbol
+1 ¡Gracias! bueno para encontrar sobre '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" ;
}
Gracias - esto es justo lo que estaba buscando. – Winter
También existe la práctica find2perl utilidad. Úselo en lugar del comando de búsqueda de Unix, con los mismos argumentos de línea de comandos que 'encontrar', y generará el código de Perl correspondiente que hace uso de File :: Find.
$ find2perl my_dir -maxdepth 2 -name "*.txt"
- 1. Windows Batch file - pipe to FIND
- 2. Find Month difference in php?
- 3. ¿Cómo puedo pasar un parámetro a la función deseada cuando uso Perl's File :: Find?
- 4. ¿Puedo usar Perl in vim con solo el dll Perl en mi sistema?
- 5. Usando let in .hs file
- 6. ¿Cómo puedo usar gems-in-a-jar con JRuby incrustado?
- 7. ¿Cómo puedo usar GTK3 con Perl?
- 8. Logging from output in Perl
- 9. ¿Cómo paso parámetros a la subrutina File :: Find que procesa cada archivo?
- 10. cómo usar el operador SQL IN en el método find de cakephp ORM
- 11. Nuking huge file in svn repository
- 12. Partial File Commit in Team Foundation
- 13. Mocking file objects or iterables in python
- 14. ¿Cómo puedo modificar mi script Perl para usar múltiples procesadores?
- 15. ¿Cómo puedo implementar Unix grep en Perl?
- 16. Before-the-dot-in-a-file-name, ¿cómo se llama?
- 17. ¿Cómo usar tenedor() en Perl?
- 18. ¿Cómo puedo usar && in si en Ruby on Rails?
- 19. ¿Cómo puedo usar el comando `find` en Linux para eliminar directorios no vacíos?
- 20. ¿Cómo debo usar Perl's File :: Temp?
- 21. Uso de Mongo Find() con $ in y Regex
- 22. ¿Cómo resuelvo un error "print() on file filele" en Perl?
- 23. CakePHP 2.1 - Cómo usar DISTINCT correctamente en find()
- 24. ¿Cómo puedo usar las // de Perl en una expresión?
- 25. ¿Cómo puedo usar una clase C++ de Perl?
- 26. ¿Cómo puedo instalar el módulo Perl sin usar CPAN.pm?
- 27. ¿Cómo puedo usar condicionalmente un módulo en Perl?
- 28. ¿Cómo puedo usar enteros de longitud arbitraria en Perl?
- 29. ¿Cómo puedo usar las bibliotecas de Perl desde PHP?
- 30. Cómo usar andWhere y orWhere in Doctrine?
'mis @files = \' find $ mi_dir -maxdepth 2 -name * .txt \ '; '... No entiendo la' sub Wanted'. ¿No puedo dar una expresión regular? –
Otra pregunta sobre [Buscar archivos con Perl] (http://stackoverflow.com/questions/17754931/finding-files-with-perl) menciona algunas alternativas que no se mencionan en las respuestas a continuación. –