2010-10-18 13 views

Respuesta

29

Puede utilizar glob para devolver una matriz de todos los archivos que coinciden con el patrón:

@files = glob("*.file"); 

foreach (@files) { 
    # do something 
} 

Si simplemente desea saber si existe un archivo que coincida con el patrón, puede omitir la misión:

if (glob("*.file")) { 
    # At least one file matches "*.file" 
} 
+6

Para completar, puedes hacer 'foreach (glob (" *. File ")) {something}' también ... – dawg

+0

Pero no puedo poner regexp allí. ¿Puedo usar expresiones regulares? – Jean

+0

@alertjean No, tendrás que abrir el directorio y escanear manualmente los nombres de los archivos con una expresión regular. 'glob' solo admite las [comodines de shell] tradicionales (http://www.tuxfiles.org/linuxhelp/wildcards.html). – meagar

0

En los sistemas * nix, he utilizado lo siguiente con buenos resultados.

sub filesExist { return scalar (my @x = `ls -1a 2> /dev/null "$_[0]"`) } 

Responde con el número de coincidencias encontradas, o 0 si no hay ninguna. Haciéndolo fácil de usar en condicionales 'if' como:

if(!filesExist("/foo/var/not*there.log") && 
    !filesExist("/foo/var/*/*.log") && 
    !filesExist("/foo/?ar/notthereeither.log")) 
{ 
    print "No matches!\n"; 
} else { 
    print "Matches found!\n"; 
} 

Exactamente qué patrones podría usar estaría determinado por lo que admita su caparazón. Pero la mayoría de las shells admiten el uso de '*' y '?' - y significan lo mismo en todas partes que he visto. Por supuesto, si elimina la llamada a la función 'escalar', devolverá las coincidencias, lo cual es útil para encontrar esos nombres de archivos variables.

Cuestiones relacionadas