1. ホーム
  2. perl

[解決済み] Perlでファイルが存在するかどうかを確認するにはどうすればよいですか?

2022-08-29 16:51:14

質問

相対パスがあります

   $base_path = "input/myMock.TGZ";

myMock.TGZ は入力フォルダーにあるファイル名です。 ファイル名は変更可能です。しかし、パスは常に $base_path .

にファイルが存在するかどうかを確認する必要があります。 $base_path .

どのように解決するのですか?

以下のテストをしてください。 何か が指定されたパスに存在するかどうかを -e ファイルテスト演算子を使用します。

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

しかし、このテストはおそらくあなたが意図しているよりも広範囲です。上記のコードは、そのパスにプレーンファイルが存在する場合に出力を生成しますが、ディレクトリ、名前付きパイプ、シンボリックリンク、あるいはもっとエキゾチックな可能性に対しても実行されます。 ドキュメントを見る を参照してください。

の拡張を考えると .TGZ の拡張を考えると、あなたは プレーンファイル を期待しているようです。その -f file-test 演算子は、パスがプレーンなファイルにつながるかどうかを尋ねます。

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

perlfunc のドキュメントでは、長い間使われてきた Perl のファイルテスト演算子 の長いリストをカバーしており、実際に遭遇する多くの状況をカバーしています。

  • -r

    ファイルは有効な uid/gid によって読み取ることができます。
  • -w

    ファイルは有効なuid/gidで書き込み可能です。
  • -x

    ファイルは有効なuid/gidで実行可能です。
  • -o

    ファイルは有効なuidによって所有されています。
  • -R

    ファイルは実際の uid/gid によって読み取ることができます。
  • -W

    ファイルは実際の uid/gid によって書き込み可能です。
  • -X

    ファイルは実際のuid/gidで実行可能です。
  • -O

    ファイルは実際の uid によって所有されています。
  • -e

    ファイルが存在します。
  • -z

    ファイルのサイズがゼロです(空です)。
  • -s

    ファイルのサイズは0ではありません(サイズをバイトで返します)。
  • -f

    Fileはプレーンファイルです。
  • -d

    ファイルはディレクトリです。
  • -l

    ファイルはシンボリックリンクです(シンボリックリンクがファイルシステムでサポートされていない場合は偽)。
  • -p

    Fileは名前付きパイプ(FIFO)、またはFilehandleはパイプです。
  • -S

    ファイルはソケットです。
  • -b

    Fileはブロック特殊ファイルです。
  • -c

    Fileは文字型特殊ファイルです。
  • -t

    ファイルハンドルはttyにオープンされています。
  • -u

    ファイルには setuid ビットが設定されています。
  • -g

    ファイルには setgid ビットが設定されています。
  • -k

    ファイルにはスティッキービットが設定されています。
  • -T

    File は ASCII または UTF-8 のテキストファイルです(ヒューリスティックな推測)。
  • -B

    ファイルは「バイナリ」ファイルです(反対は -T ).
  • -M

    スクリプトの開始時間からファイルの修正時間を引いた日数。
  • -A

    アクセスタイムも同様です。
  • -C

    inodeの変更時間に同じ(Unix、他のプラットフォームでは異なる場合があります。)