识别普通文件夹和“。”/“..”文件夹之间的区别

时间:2012-12-17 21:49:47

标签: perl file directory

我正在编写一个Perl脚本来自动从文件夹中复制PDF。

用户无法访问他们没有权限的文件夹,因此他们不会意外地获取他们不应该访问的任何信息。

我有一个粗略的模型,除了一个错误之外有效:它会一直看到...文件夹并打开它们进入无限循环。

检查以下条件语句以查看该文件是PDF,然后将其传递给我的copyPDF,它检查异常然后复制文件;如果文件夹扫描该内容并重复,它会通过并尝试打开文件夹。

我尝试了多种方法来忽略...,但它总是导致忽略所有其他子文件夹。有人有工作吗?

if ($file =~ /\.pdf$/i) {
  print "$file is a pdf\n";
  $fileLocation = "$directoryName/$file";
  copyPDF("$fileLocation", "$file");
}
elsif ($file == '.') {
  #print "argh\n";
}
else {
  $openFolder = "$directory/$file";
  print "*$openFolder";
  openNextDirectory("$openFolder");
}

3 个答案:

答案 0 :(得分:4)

始终使用use strict; use warnings; !!!

$file == '.'

产生

Argument "." isn't numeric in numeric eq (==)

因为您要求Perl比较两个数字。你应该使用

$file eq '.'

有关perl运营商的详细信息,请参阅perldoc perlop

答案 1 :(得分:2)

这个老问题有一些很好的答案可以解决这个问题和类似的问题:

How can I copy a directory recursively and filter filenames in Perl?

答案 2 :(得分:-3)

使用File::Find模块

use File::Find;
use File::Copy;

my $directory = 'c:\my\pdf\directory';
find(\&pdfcopy, $directory);

sub pdfcopy() {
    my $newdirectory = 'c:\some\new\dir';
    return if ($File::Find::name !~ /\.pdf$/i);
    copy($File::Find::name, $newdirectory) or 
    die "File $File::Find::name cannot be copied: !";
}