Bagaimana cara memeriksa apakah ada file di Perl?


112

Saya memiliki jalur relatif

   $base_path = "input/myMock.TGZ";

myMock.TGZadalah nama file yang terletak di folder input. Nama file bisa berubah. Tapi jalannya selalu disimpan $base_path.

Saya perlu memeriksa apakah file tersebut ada di $base_path.

Jawaban:


179

Uji apakah ada sesuatu di jalur tertentu menggunakan -eoperator file-test.

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

Namun, tes ini mungkin lebih luas dari yang Anda inginkan. Kode di atas akan menghasilkan output jika file biasa ada di jalur itu, tetapi juga akan diaktifkan untuk direktori, pipa bernama, symlink, atau kemungkinan yang lebih eksotis. Lihat dokumentasi untuk detailnya.

Mengingat ekstensi dari .TGZpertanyaan Anda, tampaknya Anda mengharapkan file biasa daripada alternatifnya. Operator -ffile-test menanyakan apakah jalur mengarah ke file biasa.

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

Dokumentasi perlfunc mencakup daftar panjang operator pengujian file Perl yang mencakup banyak situasi yang akan Anda hadapi dalam praktik.

  • -r
    File dapat dibaca oleh uid / gid yang efektif.
  • -w
    File dapat ditulis oleh uid / gid yang efektif.
  • -x
    File dapat dieksekusi oleh uid / gid yang efektif.
  • -o
    File dimiliki oleh uid yang efektif.
  • -R
    File dapat dibaca oleh uid / gid asli.
  • -W
    File dapat ditulis oleh uid / gid asli.
  • -X
    File dapat dieksekusi oleh uid / gid asli.
  • -O
    File dimiliki oleh uid asli.
  • -e
    File ada.
  • -z
    File berukuran nol (kosong).
  • -s
    File memiliki ukuran bukan nol (ukuran hasil dalam byte).
  • -f
    File adalah file biasa.
  • -d
    File adalah direktori.
  • -l
    File adalah tautan simbolis (salah jika symlink tidak didukung oleh sistem file).
  • -p
    File adalah pipa bernama (FIFO), atau Filehandle adalah pipa.
  • -S
    File adalah soket.
  • -b
    File adalah file khusus blok.
  • -c
    File adalah file khusus karakter.
  • -t
    Filehandle dibuka untuk tty.
  • -u
    File telah menetapkan bit setuid.
  • -g
    File memiliki kumpulan bit setgid.
  • -k
    File memiliki kumpulan bit lengket.
  • -T
    File adalah file teks ASCII atau UTF-8 (tebakan heuristik).
  • -B
    File adalah file "biner" (kebalikan dari -T).
  • -M
    Waktu mulai skrip dikurangi waktu modifikasi file, dalam hari.
  • -A
    Sama untuk waktu akses.
  • -C
    Sama untuk waktu perubahan inode (Unix, mungkin berbeda untuk platform lain)

hai bacon, senang melihatmu. jadi -e bahkan bekerja untuk jalur relatif? saya pikir itu hanya bekerja untuk file tertentu ... terima kasih keren
superstar

3
@superstar Halo lagi! Ya, -eberfungsi dengan jalur relatif, tetapi saya pikir saya mungkin telah salah memahami pertanyaan Anda. Apakah Anda memiliki direktori bernama myMock.TGZ, dan Anda ingin tahu apakah direktori tersebut berisi file dengan nama tertentu? Bantu kami memberikan jawaban yang lebih baik dengan mengedit pertanyaan Anda untuk menyertakan contoh!
Greg Bacon

29

Anda mungkin menginginkan varian dari ada ... 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 adalah operator 'keberadaan' di Perl.

Anda dapat memeriksa izin dan atribut lainnya menggunakan kode di halaman ini .


3
Mengapa tidak menautkan ke dokumentasi resmi untuk operator ini saja?
Eter

@Ether, hanya karena saya mencari operator keberadaan dan ini adalah halaman pertama yang saya temukan. PerlDoc mungkin merupakan pilihan yang lebih baik dalam retrospeksi.
mdm

13

Kamu bisa memakai: if(-e $base_path)


7
Anda juga dapat menggunakan -funtuk menguji file normal (sebagai lawan dari direktori atau berbagai jenis file khusus lainnya)
justintime

11

Menggunakan:

if (-f $filePath)
{
  # code
}

-emengembalikan nilai true meskipun file tersebut adalah direktori. -fhanya akan mengembalikan true jika itu file yang sebenarnya


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";}

akan berhasil


1

Gunakan kode di bawah ini. Di sini -f memeriksa, itu file atau bukan:

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

dan nikmati

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.