Pregunta

Estoy tratando de obtener una lista de subdirectorios en un directorio dado usando algo como lo siguiente:

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

use File::Find::Rule;
use Data::Dumper;

my @subdirs = File::Find::Rule->maxdepth(1)->directory->relative->in('mydir');

print Dumper(@subdirs);

Sin embargo, ejecutar esto da el resultado:

  

Dependencia insegura en chdir mientras se ejecuta con el interruptor -T

Entiendo que File :: Find tiene opciones para tratar con el modo de contaminación, pero parece que no puedo encontrar un equivalente en Archivo :: Buscar :: Regla . ¿Es posible hacer lo anterior? ¿Debo usar un método alternativo para enumerar subdirectorios? ¿Estoy malentendiendo por completo algo obvio que realmente debería entender sobre el modo de contaminación?

¿Fue útil?

Solución

( Editar !) Bien, la lógica sugeriría que arrojar lo siguiente funcionaría:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Esto le permite usar las características de modo de manchado de File :: Find pasando los argumentos directamente a la función find () de ese módulo. Por cierto, File :: Find menciona que uno debe establecer $ untaint_pattern utilizando el operador qr // . Por ejemplo, el valor predeterminado es

$untaint_pattern = qr|^([-+@\w./]+)$|

Sin embargo , ¡esto no funciona! De hecho, su problema es un error conocido en File :: Find :: Rule. (Por ejemplo, aquí están CPAN y Debian informes de errores.) Si desea una corrección de errores, ambos esos informes de errores tienen parches.

Si está en un entorno restringido, una cosa que puede hacer es implementar el parche usted mismo en su código. Por ejemplo, si desea mantener todo en un archivo, puede agregar el bloque de código grande a continuación después de usar File :: Find :: Rule . Tenga en cuenta que esta es una solución muy rápida y puede ser subóptima. Si no funciona para usted (por ejemplo, porque tiene espacios en sus nombres de archivo), cambie el patrón qr | ^ ([- + @ \ w ./font>+)$ | que se utiliza .

Tenga en cuenta finalmente que si desea que su organización de código sea un poco mejor, es posible que desee volcar esto en un paquete separado, tal vez llamado MyFileFindRuleFix o algo así, que siempre use después de Archivo :: Buscar :: Regla en sí.

package File::Find::Rule;
no warnings qw(redefine);
sub in {
    my $self = _force_object shift;

    my @found;
    my $fragment = $self->_compile( $self->{subs} );
    my @subs = @{ $self->{subs} };

    warn "relative mode handed multiple paths - that's a bit silly\n"
      if $self->{relative} && @_ > 1;

    my $topdir;
    my $code = 'sub {
        (my $path = $File::Find::name)  =~ s#^(?:\./+)+##;
        $path = "." if ($path eq ""); # See Debian bug #329377
        my @args = (

( Editar !) Bien, la lógica sugeriría que arrojar lo siguiente funcionaría:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Esto le permite usar las características de modo de manchado de File :: Find pasando los argumentos directamente a la función find () de ese módulo. Por cierto, File :: Find menciona que uno debe establecer $ untaint_pattern utilizando el operador qr // . Por ejemplo, el valor predeterminado es

$untaint_pattern = qr|^([-+@\w./]+)$|

Sin embargo , ¡esto no funciona! De hecho, su problema es un error conocido en File :: Find :: Rule. (Por ejemplo, aquí están CPAN y Debian informes de errores.) Si desea una corrección de errores, ambos esos informes de errores tienen parches.

Si está en un entorno restringido, una cosa que puede hacer es implementar el parche usted mismo en su código. Por ejemplo, si desea mantener todo en un archivo, puede agregar el bloque de código grande a continuación después de usar File :: Find :: Rule . Tenga en cuenta que esta es una solución muy rápida y puede ser subóptima. Si no funciona para usted (por ejemplo, porque tiene espacios en sus nombres de archivo), cambie el patrón qr | ^ ([- + @ \ w ./font>+)$ | que se utiliza .

Tenga en cuenta finalmente que si desea que su organización de código sea un poco mejor, es posible que desee volcar esto en un paquete separado, tal vez llamado MyFileFindRuleFix o algo así, que siempre use después de Archivo :: Buscar :: Regla en sí.

<*>, $File::Find::dir, $path); my $maxdepth = $self->{maxdepth}; my $mindepth = $self->{mindepth}; my $relative = $self->{relative}; # figure out the relative path and depth my $relpath = $File::Find::name; $relpath =~ s{^\Q$topdir\E/?}{}; my $depth = scalar File::Spec->splitdir($relpath); #print "name: \'$File::Find::name\' "; #print "relpath: \'$relpath\' depth: $depth relative: $relative\n"; defined $maxdepth && $depth >= $maxdepth and $File::Find::prune = 1; defined $mindepth && $depth < $mindepth and return; #print "Testing \'

( Editar !) Bien, la lógica sugeriría que arrojar lo siguiente funcionaría:

->extras( {untaint => 1, untaint_pattern => $untaint_pattern, untaint_skip => 1} )

Esto le permite usar las características de modo de manchado de File :: Find pasando los argumentos directamente a la función find () de ese módulo. Por cierto, File :: Find menciona que uno debe establecer $ untaint_pattern utilizando el operador qr // . Por ejemplo, el valor predeterminado es

$untaint_pattern = qr|^([-+@\w./]+)$|

Sin embargo , ¡esto no funciona! De hecho, su problema es un error conocido en File :: Find :: Rule. (Por ejemplo, aquí están CPAN y Debian informes de errores.) Si desea una corrección de errores, ambos esos informes de errores tienen parches.

Si está en un entorno restringido, una cosa que puede hacer es implementar el parche usted mismo en su código. Por ejemplo, si desea mantener todo en un archivo, puede agregar el bloque de código grande a continuación después de usar File :: Find :: Rule . Tenga en cuenta que esta es una solución muy rápida y puede ser subóptima. Si no funciona para usted (por ejemplo, porque tiene espacios en sus nombres de archivo), cambie el patrón qr | ^ ([- + @ \ w ./font>+)$ | que se utiliza .

Tenga en cuenta finalmente que si desea que su organización de código sea un poco mejor, es posible que desee volcar esto en un paquete separado, tal vez llamado MyFileFindRuleFix o algo así, que siempre use después de Archivo :: Buscar :: Regla en sí.

<*>\'\n"; my $discarded; return unless ' . $fragment . '; return if $discarded; if ($relative) { push @found, $relpath if $relpath ne ""; } else { push @found, $path; } }'; #use Data::Dumper; #print Dumper \@subs; #warn "Compiled sub: '$code'\n"; my $sub = eval "$code" or die "compile error '$code' $@"; my $cwd = getcwd; # Untaint it if ( $cwd =~ qr|^([-+@\w./]+)$| ) { $cwd = $1; } else { die "Couldn't untaint \$cwd: [$cwd]"; } for my $path (@_) { # $topdir is used for relative and maxdepth $topdir = $path; # slice off the trailing slash if there is one (the # maxdepth/mindepth code is fussy) $topdir =~ s{/?$}{} unless $topdir eq '/'; $self->_call_find( { %{ $self->{extras} }, wanted => $sub }, $path ); } chdir $cwd; return @found; } use warnings; package main;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top