如何使用Perl检查文件的扩展名?

时间:2010-10-15 07:52:55

标签: perl file

对于我的perl脚本,文件作为争论传递。该文件可以是.txt文件或包含.zip文件的.txt文件。

我想编写看起来像这样的代码

if ($file is a zip) {

    unzip $file
    $file =~ s/zip$/txt/;
}

检查扩展名的一种方法是在.上进行拆分,然后匹配数组中的最后一个结果(通过拆分返回)。

有更好的方法吗?

7 个答案:

答案 0 :(得分:12)

另一种解决方案是使用File::Type来确定二进制文件的类型。

use strict;
use warnings;

use File::Type;

my $file      = '/path/to/file.ext';
my $ft        = File::Type->new();
my $file_type = $ft->mime_type($file);

if ( $file_type eq 'application/octet-stream' ) {
    # possibly a text file
}
elsif ( $file_type eq 'application/zip' ) {
    # file is a zip archive
}

这样,您就不必处理丢失/错误的扩展。

答案 1 :(得分:11)

您可以使用File :: Basename。

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

use File::Basename;

my @exts = qw(.txt .zip);

while (my $file = <DATA>) {
  chomp $file;
  my ($name, $dir, $ext) = fileparse($file, @exts);

  given ($ext) {
    when ('.txt') {
      say "$file is a text file";
    }
    when ('.zip') {
      say "$file is a zip file";
    }
    default {
      say "$file is an unknown file type";
    }
  }
}

__DATA__
file.txt
file.zip
file.pl

运行此命令:

$ ./files 
file.txt is a text file
file.zip is a zip file
file.pl is an unknown file type

答案 2 :(得分:7)

如何检查文件名的结尾?

if ($file =~ /\.zip$/i) {

然后:

use strict;
use Archive::Extract;

if ($file =~ /\.zip$/i) {
    my $ae = Archive::Extract->new(archive => $file);
    my $ok = $ae->extract();
    my $files = $ae->files();
}

更多信息here

答案 3 :(得分:3)

您可以使用正则表达式匹配检查文件扩展名为:

if($file =~ /\.zip$/i) {
        # $file is a zip file 
}

答案 4 :(得分:2)

为什么要依赖文件扩展名?只是尝试解压缩并使用适当的异常处理:

eval {
    # try to unzip the file
};

if ($@) {
    # not a zip file
}

答案 5 :(得分:2)

我知道这个问题有几年的历史了,但是对于将来来到这里的任何人来说,将文件路径拆分为其组成路径,文件名,基本名称和扩展名的简单方法如下。

use File::Basename;

my $filepath = '/foo/bar.txt';

my ($basename, $parentdir, $extension) = fileparse($filepath, qr/\.[^.]*$/);
my $filename = $basename . $extension;

您可以使用以下内容测试结果。

my @test_paths = (
    '/foo/bar/fish.wibble',
    '/foo/bar/fish.',
    '/foo/bar/fish.asdf.d',
    '/foo/bar/fish.wibble.',
    '/fish.wibble',
    'fish.wibble',
);

foreach my $this_path (@test_paths) {
    print "Current path: $this_path\n";
    my ($this_basename, $parentdir, $extension) = fileparse($this_path, qr/\.[^.]*$/);
    my $this_filename = $this_basename . $extension;

    foreach my $var (qw/$parentdir $this_filename $this_basename $extension/) {
        print "$var = '" . eval($var) . "'\n";
    }

    print "\n\n";
}

希望这有帮助。

答案 6 :(得分:0)

也许有点晚了,但可以用作替代参考:

sub unzip_all {
     my $director = shift;
     opendir my $DIRH, "$director" or die;
     my @files = readdir $DIRH;
     foreach my $file (@files){
              my $type = `file $director/$file`; 
              if ($type =~ m/gzip compressed data/){
                      system "gunzip $director/$file";
              }
      }       
      close $DIRH;
      return;
}

这里可以使用Linux file通过使用backticks(``)从perl执行它。您可以通过文件夹的路径并评估是否存在被file分类为gzip压缩文件的文件。