¿Cómo puedo comprobar si existe un archivo en Perl?

112

Tengo un camino relativo

   $base_path = "input/myMock.TGZ";

myMock.TGZes el nombre del archivo ubicado en la carpeta de entrada. El nombre del archivo puede cambiar. Pero el camino siempre se almacena en $base_path.

Necesito comprobar si el archivo existe en formato $base_path.

superestrella
fuente

Respuestas:

179

Pruebe si existe algo en una ruta determinada utilizando el -eoperador de prueba de archivo.

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

Sin embargo, esta prueba probablemente sea más amplia de lo que pretendes. El código anterior generará una salida si existe un archivo plano 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. Consulte la documentación para obtener más detalles.

Dada la extensión de .TGZen su pregunta, parece que espera un archivo sin formato en lugar de las alternativas. El -foperador de prueba de archivo pregunta si una ruta conduce a un archivo sin formato.

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

La documentación de perlfunc cubre la larga lista de operadores de prueba de archivos de Perl que cubre muchas situaciones que encontrará en la práctica.

  • -r
    El archivo es legible por uid / gid efectivo.
  • -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 uid efectivo.
  • -R
    El archivo es legible por uid / gid real.
  • -W
    El archivo se puede escribir mediante uid / gid real.
  • -X
    El archivo es ejecutable por uid / gid real.
  • -O
    El archivo es propiedad de uid real.
  • -e
    El archivo existe.
  • -z
    El archivo tiene 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
    El archivo es un directorio.
  • -l
    El 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 socket.
  • -b
    El archivo es un archivo especial de bloque.
  • -c
    El archivo es un archivo especial de carácter.
  • -t
    Filehandle se abre a un tty.
  • -u
    El archivo tiene el bit setuid establecido.
  • -g
    El archivo tiene el bit setgid establecido.
  • -k
    El archivo tiene un bit adhesivo establecido.
  • -T
    El archivo es un archivo de texto ASCII o UTF-8 (suposición heurística).
  • -B
    El archivo es un archivo "binario" (opuesto a -T).
  • -M
    La hora de inicio del script menos la hora de modificación del archivo, en días.
  • -A
    Lo mismo ocurre con el tiempo de acceso.
  • -C
    Lo mismo para el tiempo de cambio de inodo (Unix, puede diferir para otras plataformas)
Greg Bacon
fuente
hey tocino, gusto en verte. entonces -¿incluso funciona para una ruta relativa? Pensé que solo funcionaba para un archivo en particular ... genial gracias
superestrella
3
@superstar ¡Hola de nuevo! Sí, -efunciona con rutas relativas, pero creo que he entendido mal tu pregunta. ¿Tiene un directorio con nombre myMock.TGZy desea saber si ese directorio contiene un archivo con un nombre en particular? Ayúdanos a darte mejores respuestas editando tu pregunta para incluir ejemplos.
Greg Bacon
29

Es posible que desee una variante de existe ... perldoc -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
               doesnt 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.
hpavc
fuente
16
if (-e $base_path)
{ 
 # code
}

-e es el operador 'existencia' en Perl.

Puede verificar los permisos y otros atributos usando el código en esta página .

mdm
fuente
3
¿Por qué no enlazar a la documentación oficial de estos operadores?
Ether
@Ether, solo porque estaba buscando el operador de existencia y es la primera página que encontré. PerlDoc fue probablemente una mejor opción en retrospectiva.
mdm
13

Puedes usar: if(-e $base_path)

Klaus Byskov Pedersen
fuente
7
También puede usar -fpara probar un archivo normal (a diferencia de un directorio o varios otros tipos especiales de archivo)
justintime
11

Utilizar:

if (-f $filePath)
{
  # code
}

-edevuelve verdadero incluso si el archivo es un directorio. -fsolo devolverá verdadero si es un archivo real

Zain Rizvi
fuente
5
#!/usr/bin/perl -w

$fileToLocate = '/whatever/path/for/file/you/are/searching/MyFile.txt';
if (-e $fileToLocate) {
    print "File is present";
}
Balaji Boggaram Ramanarayan
fuente
5
if(-e $base_path){print "Something";}

haría el truco


fuente
1

Utilice el siguiente código. Aquí -f comprueba, es un archivo o no:

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

y disfrutar

Nikhil Ranjan
fuente