Jak mogę sprawdzić, czy plik istnieje w Perlu?

112

Mam względną ścieżkę

   $base_path = "input/myMock.TGZ";

myMock.TGZto nazwa pliku znajdującego się w folderze wejściowym. Nazwa pliku może się zmienić. Ale ścieżka jest zawsze przechowywana w $base_path.

Muszę sprawdzić, czy plik istnieje w formacie $base_path.

Super gwiazda
źródło

Odpowiedzi:

179

Sprawdź, czy coś istnieje w podanej ścieżce, używając -eoperatora testu pliku.

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

Jednak ten test jest prawdopodobnie szerszy niż zamierzasz. Powyższy kod wygeneruje dane wyjściowe, jeśli w tej ścieżce istnieje zwykły plik, ale uruchomi się również dla katalogu, nazwanego potoku, dowiązania symbolicznego lub bardziej egzotycznej możliwości. Szczegółowe informacje można znaleźć w dokumentacji .

Biorąc pod uwagę rozszerzenie .TGZpytania, wydaje się, że spodziewasz się zwykłego pliku, a nie alternatyw. -fOperatora plik test zapytuje, czy ścieżka prowadzi do zwykłego pliku.

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

Dokumentacja perlfunc zawiera długą listę operatorów testów plików Perla, która obejmuje wiele sytuacji, które napotkasz w praktyce.

  • -r
    Plik można odczytać za pomocą efektywnego uid / gid.
  • -w
    Plik jest zapisywalny przez efektywny UID / GID.
  • -x
    Plik jest wykonywany przez efektywny uid / gid.
  • -o
    Plik jest własnością efektywnego UID.
  • -R
    Plik można odczytać za pomocą rzeczywistego UID / GID.
  • -W
    Plik jest zapisywalny przez rzeczywisty UID / GID.
  • -X
    Plik jest wykonywany przez prawdziwy UID / GID.
  • -O
    Plik jest własnością prawdziwego UID.
  • -e
    Plik istnieje.
  • -z
    Plik ma zerowy rozmiar (jest pusty).
  • -s
    Plik ma niezerowy rozmiar (zwraca rozmiar w bajtach).
  • -f
    Plik jest zwykłym plikiem.
  • -d
    Plik jest katalogiem.
  • -l
    Plik jest dowiązaniem symbolicznym (fałsz, jeśli dowiązania symboliczne nie są obsługiwane przez system plików).
  • -p
    Plik jest potokiem nazwanym (FIFO) lub Uchwyt pliku jest potokiem.
  • -S
    Plik jest gniazdem.
  • -b
    Plik jest blokowym plikiem specjalnym.
  • -c
    Plik to znakowy plik specjalny.
  • -t
    Filehandle jest otwierany na terminalu tty.
  • -u
    Plik ma ustawiony bit setuid.
  • -g
    Plik ma ustawiony bit setgid.
  • -k
    Plik ma ustawiony bit lepki.
  • -T
    Plik jest plikiem tekstowym ASCII lub UTF-8 (przypuszczenie heurystyczne).
  • -B
    Plik jest plikiem „binarnym” (przeciwieństwo -T).
  • -M
    Czas rozpoczęcia skryptu minus czas modyfikacji pliku, w dniach.
  • -A
    To samo dotyczy czasu dostępu.
  • -C
    To samo dotyczy czasu zmiany i-węzła (Unix, może się różnić na innych platformach)
Greg Bacon
źródło
hej bekonie, miło cię widzieć. więc -e działa nawet dla ścieżki względnej? Myślałem, że działa tylko dla konkretnego pliku ... fajne dzięki
superstar
3
@ superstar Witam ponownie! Tak, -edziała ze ścieżkami względnymi, ale myślę, że mogłem źle zrozumieć twoje pytanie. Czy masz katalog o nazwie myMock.TGZi chcesz wiedzieć, czy zawiera on plik o określonej nazwie? Pomóż nam udzielić Ci lepszych odpowiedzi, edytując swoje pytanie i dołączając przykłady!
Greg Bacon
29

Możesz chcieć wariant istnieje ... 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
źródło
16
if (-e $base_path)
{ 
 # code
}

-e jest operatorem „istnienia” w Perlu.

Możesz sprawdzić uprawnienia i inne atrybuty za pomocą kodu na tej stronie .

mdm
źródło
3
Dlaczego zamiast tego nie zamieścić łącza do oficjalnej dokumentacji tych operatorów?
Ether
@Ether, tylko dlatego, że szukałem operatora egzystencji i jest to pierwsza strona, którą znalazłem. Z perspektywy czasu PerlDoc był prawdopodobnie lepszą opcją.
mdm
13

Możesz użyć: if(-e $base_path)

Klaus Byskov Pedersen
źródło
7
Możesz również użyć -fdo przetestowania normalnego pliku (w przeciwieństwie do katalogu lub różnych innych specjalnych typów plików)
justintime Kwietnia
11

Posługiwać się:

if (-f $filePath)
{
  # code
}

-ezwraca prawdę, nawet jeśli plik jest katalogiem. -fzwróci prawdę tylko wtedy, gdy jest to rzeczywisty plik

Zain Rizvi
źródło
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
źródło
5
if(-e $base_path){print "Something";}

załatwi sprawę


źródło
1

Użyj poniższego kodu. Tutaj -f sprawdza, czy to plik czy nie:

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

i baw się dobrze

Nikhil Ranjan
źródło