Wie kann ich überprüfen, ob eine Datei in Perl vorhanden ist?


112

Ich habe einen relativen Weg

   $base_path = "input/myMock.TGZ";

myMock.TGZist der Dateiname im Eingabeordner. Der Dateiname kann sich ändern. Der Pfad wird jedoch immer in gespeichert $base_path.

Ich muss überprüfen, ob die Datei in existiert $base_path.

Antworten:


178

Testen Sie mithilfe des Dateitestoperators, ob an einem bestimmten Pfad etwas vorhanden ist -e.

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

Dieser Test ist jedoch wahrscheinlich umfassender als beabsichtigt. Der obige Code generiert eine Ausgabe, wenn eine einfache Datei unter diesem Pfad vorhanden ist. Er wird jedoch auch für ein Verzeichnis, eine Named Pipe, einen Symlink oder eine exotischere Möglichkeit ausgelöst. Einzelheiten finden Sie in der Dokumentation .

Angesichts der Erweiterung von .TGZin Ihrer Frage scheint es, dass Sie eher eine einfache Datei als die Alternativen erwarten . Der -fDateitestoperator fragt, ob ein Pfad zu einer einfachen Datei führt.

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

Die perlfunc-Dokumentation enthält die lange Liste der Perl- Dateitestoperatoren , die viele Situationen abdeckt, denen Sie in der Praxis begegnen werden.

  • -r
    Die Datei kann von der effektiven UID / GID gelesen werden.
  • -w
    Die Datei kann mit der effektiven UID / GID geschrieben werden.
  • -x
    Die Datei kann von der effektiven UID / GID ausgeführt werden.
  • -o
    Die Datei gehört der effektiven UID.
  • -R
    Die Datei kann von real uid / gid gelesen werden.
  • -W
    Die Datei kann mit real uid / gid geschrieben werden.
  • -X
    Die Datei kann von real uid / gid ausgeführt werden.
  • -O
    Die Datei gehört real uid.
  • -e
    Datei existiert.
  • -z
    Die Datei hat die Größe Null (ist leer).
  • -s
    Die Datei hat eine Größe ungleich Null (gibt die Größe in Byte zurück).
  • -f
    Datei ist eine einfache Datei.
  • -d
    Datei ist ein Verzeichnis.
  • -l
    Datei ist ein symbolischer Link (false, wenn Symlinks vom Dateisystem nicht unterstützt werden).
  • -p
    Datei ist eine Named Pipe (FIFO) oder Filehandle ist eine Pipe.
  • -S
    Datei ist ein Socket.
  • -b
    Datei ist eine Blockspezialdatei.
  • -c
    Datei ist eine Zeichenspezialdatei.
  • -t
    Dateihandle wird zu einem tty geöffnet.
  • -u
    Datei hat gesetztes Bit gesetzt.
  • -g
    Datei hat setgid Bit gesetzt.
  • -k
    Datei hat Sticky Bit gesetzt.
  • -T
    Datei ist eine ASCII- oder UTF-8-Textdatei (heuristische Vermutung).
  • -B
    Datei ist eine "binäre" Datei (Gegenteil von -T).
  • -M
    Startzeit des Skripts abzüglich der Änderungszeit der Datei in Tagen.
  • -A
    Gleiches gilt für die Zugriffszeit.
  • -C
    Gleiches gilt für die Inode-Änderungszeit (Unix, kann für andere Plattformen abweichen)

Hey Speck, schön dich zu sehen. Also -e arbeitet sogar für einen relativen Pfad? Ich dachte, es funktioniert nur für bestimmte Datei ... cool danke
Superstar

3
@superstar Hallo nochmal! Ja, -earbeitet mit relativen Pfaden, aber ich glaube, ich habe Ihre Frage möglicherweise falsch verstanden. Haben Sie ein Verzeichnis mit dem Namen myMock.TGZund möchten wissen, ob dieses Verzeichnis eine Datei mit einem bestimmten Namen enthält? Helfen Sie uns, Ihnen bessere Antworten zu geben, indem Sie Ihre Frage so bearbeiten, dass sie Beispiele enthält!
Greg Bacon

29

Vielleicht möchten Sie eine Variante von existiert ... 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 ist der 'Existenz'-Operator in Perl.

Sie können Berechtigungen und andere Attribute mithilfe des Codes auf dieser Seite überprüfen .


3
Warum nicht stattdessen auf die offizielle Dokumentation dieser Betreiber verlinken?
Ether

@Ether, nur weil ich nach dem Existenzoperator gesucht habe und es die erste Seite ist, die ich gefunden habe. PerlDoc war im Nachhinein wahrscheinlich eine bessere Option.
Mdm

13

Sie können verwenden: if(-e $base_path)


7
Sie können auch verwenden -f, um nach einer normalen Datei zu testen (im Gegensatz zu einem Verzeichnis oder verschiedenen anderen speziellen Dateitypen)
justintime

11

Verwenden:

if (-f $filePath)
{
  # code
}

-eGibt true zurück, auch wenn die Datei ein Verzeichnis ist. -fgibt nur dann true zurück, wenn es sich um eine tatsächliche Datei handelt


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

würde den Trick machen


1

Verwenden Sie den folgenden Code. Hier - wenn überprüft, ist es eine Datei oder nicht:

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

und genieße

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.