2010-04-08 16 views
79

que tienen una ruta relativa¿Cómo puedo verificar si existe un archivo en Perl?

$base_path = "input/myMock.TGZ"; 

myMock.TGZ es el nombre de archivo que se encuentra en la carpeta de entrada. El nombre del archivo puede cambiar. Pero la ruta siempre se almacena en $base_path.

Necesito comprobar si el archivo existe en $base_path.

Respuesta

128

Compruebe si algo existe en una ruta dada usando el operador de prueba de archivo -e.

print "$base_path exists!\n" if -e $base_path; 

Sin embargo, esta prueba es probablemente más amplia de lo que esperaba. El código anterior generará resultados si existe un archivo simple en esa ruta, pero también se activará para un directorio, una tubería con nombre, un enlace simbólico o una posibilidad más exótica. See the documentation para más detalles.

Dada la extensión de .TGZ en su pregunta, parece que espera un archivo simple en lugar de las alternativas. El operador de prueba de archivo -f pregunta si una ruta conduce a un archivo simple.

print "$base_path is a plain file!\n" if -f $base_path; 

La documentación perlfunc cubre la larga lista de Perl's file-test operators que cubre muchas situaciones que se encontrará en la práctica.

  • -r
    archivo es legible por efectivos UID/GID.
  • -w
    El archivo se puede escribir mediante uid/gid efectivo.
  • -x
    El archivo es ejecutable por uid/gid efectivo.
  • -o
    El archivo es propiedad de effective uid.
  • -R
    archivo es legible por bienes UID/GID.
  • -W
    El archivo puede ser escrito por uid/gid real.
  • -X
    El archivo es ejecutable por uid/gid real.
  • -O
    El archivo es propiedad de real uid.
  • -e
    Existe el archivo.
  • -z
    El archivo tiene un tamaño cero (está vacío).
  • -s
    El archivo tiene un tamaño distinto de cero (devuelve el tamaño en bytes).
  • -f
    El archivo es un archivo simple.
  • -d
    Archivo es un directorio.
  • -l
    archivo es un enlace simbólico (falso si los enlaces simbólicos no son compatibles con el sistema de archivos).
  • -p
    El archivo es una tubería con nombre (FIFO) o Filehandle es una tubería.
  • -S
    El archivo es un zócalo.
  • -b
    El archivo es un archivo especial de bloque.
  • -c
    El archivo es un archivo especial de caracteres.
  • -t
    Filehandle está abierto a un tty.
  • -u
    El archivo tiene setuid bit set.
  • -g
    El archivo tiene setgid bit set.
  • -k
    El archivo tiene un conjunto de bits adhesivos.
  • -T
    archivo es un archivo de texto ASCII o UTF-8 (conjetura heurístico).
  • -B
    archivo es un archivo “binario” (opuesto de -T).
  • -M
    Tiempo de inicio del script menos el tiempo de modificación del archivo, en días.
  • -A
    Lo mismo para el tiempo de acceso.
  • -C
    Lo mismo para el tiempo de cambio del inode (Unix, pueden ser diferentes para otras plataformas)
+0

hey tocino, un placer verte. entonces, ¿incluso funciona para una ruta relativa? pensé que solo funcionaba para archivos en particular ... buenas gracias – superstar

+3

@superstar ¡Hola otra vez! Sí, '-e' funciona con rutas relativas, pero creo que puedo haber malentendido tu pregunta. ¿Tiene un * directorio * llamado 'myMock.TGZ', y desea saber si ese directorio contiene un archivo con un nombre particular? ¡Ayúdenos a darle mejores respuestas editando su pregunta para incluir ejemplos! –

13
if (-e $base_path) 
{ 
# code 
} 

-e es el operador de la 'existencia' en Perl.

Puede verificar permisos y otros atributos usando el código en this page.

+2

Por qué no enlazar a la documentación oficial para estos operadores en lugar? – Ether

+0

@Ether, solo porque estaba buscando el operador de existencia y es la primera página que encontré. PerlDoc probablemente fue una mejor opción en retrospectiva. – mdm

12

que puede utilizar: if(-e $base_path)

+7

También puede usar '-f' para probar un archivo normal (a diferencia de un directorio u otros tipos de archivos especiales) – justintime

29

Es posible que desee una variante de perldoc existe ... -f "-f"

 -X FILEHANDLE 
     -X EXPR 
     -X DIRHANDLE 
     -X  A file test, where X is one of the letters listed below. This unary operator takes one argument, 
       either a filename, a filehandle, or a dirhandle, and tests the associated file to see if something is 
       true about it. If the argument is omitted, tests $_, except for "-t", which tests STDIN. Unless 
       otherwise documented, it returns 1 for true and '' for false, or the undefined value if the file 
       doesn’t exist. Despite the funny names, precedence is the same as any other named unary operator. 
       The operator may be any of: 

        -r File is readable by effective uid/gid. 
        -w File is writable by effective uid/gid. 
        -x File is executable by effective uid/gid. 
        -o File is owned by effective uid. 

        -R File is readable by real uid/gid. 
        -W File is writable by real uid/gid. 
        -X File is executable by real uid/gid. 
        -O File is owned by real uid. 

        -e File exists. 
        -z File has zero size (is empty). 
        -s File has nonzero size (returns size in bytes). 

        -f File is a plain file. 
        -d File is a directory. 
        -l File is a symbolic link. 
        -p File is a named pipe (FIFO), or Filehandle is a pipe. 
        -S File is a socket. 
        -b File is a block special file. 
        -c File is a character special file. 
        -t Filehandle is opened to a tty. 

        -u File has setuid bit set. 
        -g File has setgid bit set. 
        -k File has sticky bit set. 

        -T File is an ASCII text file (heuristic guess). 
        -B File is a "binary" file (opposite of -T). 

        -M Script start time minus file modification time, in days. 
9

Usar:

if (-f $filePath) 
{ 
    # code 
} 

-e devuelve verdadero incluso si el archivo es un directorio. -f sólo devolverá verdadero si se trata de un archivo real

5
#!/usr/bin/perl -w 

$fileToLocate = '/whatever/path/for/file/you/are/searching/MyFile.txt'; 
if (-e $fileToLocate) { 
    print "File is present"; 
} 
0

Utilice el código de abajo. Aquí cheques -F, que es un archivo o no:

print "File $base_path is exists!\n" if -f $base_path; 

y disfrutar de

3
if(-e $base_path){print "Something";} 

que hacer el truco

Cuestiones relacionadas