Como posso verificar se existe um arquivo em Perl?


112

Eu tenho um caminho relativo

   $base_path = "input/myMock.TGZ";

myMock.TGZé o nome do arquivo localizado na pasta de entrada. O nome do arquivo pode mudar. Mas o caminho está sempre armazenado em $base_path.

Preciso verificar se o arquivo existe em $base_path.

Respostas:


179

Teste se algo existe em determinado caminho usando o -eoperador de teste de arquivo.

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

No entanto, este teste é provavelmente mais amplo do que você pretende. O código acima irá gerar saída se um arquivo simples existir nesse caminho, mas também irá disparar para um diretório, um pipe nomeado, um link simbólico ou uma possibilidade mais exótica. Consulte a documentação para obter detalhes.

Dada a extensão de .TGZem sua pergunta, parece que você espera um arquivo simples em vez de alternativas. O -foperador de teste de arquivo pergunta se um caminho leva a um arquivo simples.

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

A documentação do perlfunc cobre a longa lista de operadores de teste de arquivo do Perl que cobre muitas situações que você encontrará na prática.

  • -r
    O arquivo pode ser lido por uid / gid efetivo.
  • -w
    O arquivo é gravável pelo uid / gid efetivo.
  • -x
    O arquivo é executável pelo uid / gid efetivo.
  • -o
    O arquivo pertence ao uid efetivo.
  • -R
    O arquivo pode ser lido por uid / gid real.
  • -W
    O arquivo pode ser escrito por uid / gid real.
  • -X
    O arquivo é executável por uid / gid real.
  • -O
    O arquivo é propriedade de uid real.
  • -e
    O arquivo existe.
  • -z
    O arquivo tem tamanho zero (está vazio).
  • -s
    O arquivo tem tamanho diferente de zero (retorna o tamanho em bytes).
  • -f
    O arquivo é um arquivo simples.
  • -d
    O arquivo é um diretório.
  • -l
    O arquivo é um link simbólico (falso se os links simbólicos não forem suportados pelo sistema de arquivos).
  • -p
    Arquivo é um canal nomeado (FIFO) ou Filehandle é um canal.
  • -S
    O arquivo é um soquete.
  • -b
    O arquivo é um arquivo especial de bloco.
  • -c
    Arquivo é um arquivo especial de caracteres.
  • -t
    Filehandle é aberto para um tty.
  • -u
    O arquivo foi definido com o bit setuid.
  • -g
    O arquivo foi definido com o bit setgid.
  • -k
    O arquivo tem o bit sticky definido.
  • -T
    Arquivo é um arquivo de texto ASCII ou UTF-8 (estimativa heurística).
  • -B
    O arquivo é um arquivo “binário” (oposto de -T).
  • -M
    Hora de início do script menos a hora de modificação do arquivo, em dias.
  • -A
    O mesmo para o tempo de acesso.
  • -C
    O mesmo para o tempo de mudança de inode (Unix, pode ser diferente para outras plataformas)

ei bacon, bom ver você. então -e ainda funciona para um caminho relativo? Achei que só funcionou para um arquivo específico ... legal, obrigado
superstar de

3
@superstar Olá de novo! Sim, -efunciona com caminhos relativos, mas acho que não entendi sua pergunta. Você tem um diretório chamado myMock.TGZe deseja saber se esse diretório contém um arquivo com um nome específico? Ajude-nos a dar respostas melhores editando sua pergunta para incluir exemplos!
Greg Bacon,

29

Você pode querer uma 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.

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

-e é o operador de 'existência' em Perl.

Você pode verificar as permissões e outros atributos usando o código nesta página .


3
Por que não criar um link para a documentação oficial desses operadores?
Ether

@Ether, só porque estava procurando o operador de existência e foi a primeira página que encontrei. PerlDoc foi provavelmente a melhor opção em retrospecto.
mdm

13

Você pode usar: if(-e $base_path)


7
Você também pode usar -fpara testar um arquivo normal (em oposição a um diretório ou vários outros tipos especiais de arquivo)
justintime

11

Usar:

if (-f $filePath)
{
  # code
}

-eretorna verdadeiro mesmo se o arquivo for um diretório. -fsó retornará verdadeiro se for um arquivo real


5
#!/usr/bin/perl -w

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

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

faria o truque


1

Use o código abaixo. Aqui -f verifica se é um arquivo ou não:

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

e aproveitar

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.