2010-04-08 41 views

Trả lời

128

Kiểm tra xem có điều gì đó tồn tại ở đường dẫn nhất định bằng toán tử kiểm tra tệp -e hay không.

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

Tuy nhiên, thử nghiệm này có lẽ rộng hơn bạn dự định. Đoạn mã trên sẽ tạo ra đầu ra nếu một tệp đơn giản tồn tại ở đường dẫn đó, nhưng nó cũng sẽ kích hoạt một thư mục, một đường ống có tên, một liên kết tượng trưng hoặc một khả năng kỳ lạ hơn. See the documentation để biết chi tiết.

Với phần mở rộng là .TGZ trong câu hỏi của bạn, có vẻ như bạn mong đợi một tệp đồng bằng thay vì các lựa chọn thay thế. Toán tử kiểm tra tệp -f hỏi xem đường dẫn có dẫn đến tệp thuần túy hay không.

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

Tài liệu perlfunc bao gồm danh sách dài Perl's file-test operators bao gồm nhiều tình huống bạn sẽ gặp phải trong thực tế.

  • -r
    file có thể đọc được bởi hiệu quả uid/gid.
  • -w
    Tệp có thể ghi bằng hiệu quả uid/gid.
  • -x
    Tệp có thể thực thi bằng uid/gid hiệu quả.
  • -o
    Tệp được sở hữu bởi hiệu quả uid.
  • -R
    Tệp có thể đọc được bằng uid/gid thực.
  • -W
    Tệp có thể ghi bởi uid/gid thực.
  • -X
    Tệp có thể được thực thi bởi uid/gid thực.
  • -O
    Tệp được sở hữu bởi real uid.
  • -e
    Tệp tồn tại.
  • -z
    Tệp có kích thước bằng 0 (trống).
  • -s
    Tệp có kích thước không đông (trả về kích thước tính bằng byte).
  • -f
    Tệp là tệp thuần túy.
  • -d
    Tệp là một thư mục.
  • -l
    Tệp là liên kết tượng trưng (sai nếu liên kết tượng trưng không được hệ thống tệp hỗ trợ).
  • -p
    Tệp là ống có tên (FIFO) hoặc Filehandle là một ống.
  • -S
    Tệp là ổ cắm.
  • -b
    Tệp là một tệp đặc biệt chặn.
  • -c
    Tệp là một tệp đặc biệt ký tự.
  • -t
    Filehandle được mở thành một tty.
  • -u
    Tệp có bộ bit được thiết lập.
  • -g
    Tệp có bộ bit setgid.
  • -k
    Tệp có bộ bit dính.
  • -T
    Tệp là tệp văn bản ASCII hoặc UTF-8 (phỏng đoán heuristic).
  • -B
    Tệp là tệp “nhị phân” (đối diện với -T).
  • -M
    Thời gian bắt đầu tập lệnh trừ đi thời gian sửa đổi tệp, tính theo ngày.
  • -A
    Tương tự cho thời gian truy cập.
  • -C
    Tương tự cho thời gian thay đổi inode (Unix, có thể khác nhau đối với các nền tảng khác)
+0

hey thịt xông khói, rất vui được gặp bạn. do đó, thậm chí có hoạt động cho một đường dẫn tương đối không? tôi nghĩ rằng nó chỉ làm việc cho tập tin cụ thể ... cảm ơn mát mẻ – superstar

+3

@ siêu sao Xin chào một lần nữa! Có, '-e' làm việc với những con đường tương đối, nhưng tôi nghĩ rằng tôi có thể đã hiểu lầm câu hỏi của bạn. Bạn có một thư mục * có tên 'myMock.TGZ' và bạn muốn biết liệu thư mục đó có chứa một tệp có tên cụ thể không? Giúp chúng tôi cung cấp cho bạn câu trả lời tốt hơn bằng cách chỉnh sửa câu hỏi của bạn để bao gồm các ví dụ! –

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

-e là toán tử 'tồn tại' trong Perl.

Bạn có thể kiểm tra quyền và các thuộc tính khác bằng cách sử dụng mã trên this page.

+2

Tại sao không liên kết đến các tài liệu chính thức cho các nhà khai thác để thay thế? – Ether

+0

@Ether, chỉ vì tôi đang tìm kiếm toán tử tồn tại và trang đầu tiên tôi tìm thấy. PerlDoc có lẽ là một lựa chọn tốt hơn khi nhìn lại. – mdm

12

Bạn có thể sử dụng: if(-e $base_path)

+7

Bạn cũng có thể sử dụng '-f' để kiểm tra một tệp bình thường (trái ngược với một thư mục hoặc các loại tệp đặc biệt khác) – justintime

29

Bạn có thể muốn một biến thể của tồn tại ... 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 
       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

Sử dụng:

if (-f $filePath) 
{ 
    # code 
} 

-e trả về true ngay cả khi tệp là thư mục. -f sẽ chỉ trả lại đúng nếu nó là một tập tin thực tế

5
#!/usr/bin/perl -w 

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

Sử dụng mã dưới đây. Dưới đây kiểm tra -f, đó là một tập tin hay không:

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

và tận hưởng

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

sẽ làm các trick

Các vấn đề liên quan