如何在Perl中获取文件的准确完整路径

26

我只有一个文件名 myfile.txt ,但不确定它保存在哪里。如何获取该文件所存储的完整路径?

我已经尝试过:

$string=`ls /abc/def/*/*/*/*/myfile.txt`;

结果:完整路径为/abc/def/ghi/jkl/mno/pqr/myfile.txt

我可以通过运行上面的Perl脚本使用shell命令来获取完整路径。然而,这需要很长时间才能返回路径。有没有一种使用Perl查找文件完整路径的方法?


请定义“完整路径”。一个文件可能有多个。它可以包括符号链接吗? - reinierpost
4个回答

29

如果myfile.txt实际上是指向该文件的相对路径,那么有一个核心模块可用于处理这个问题 - File::Spec->rel2abs()

  use File::Spec;
  ...
  my $rel_path = 'myfile.txt';
  my $abs_path = File::Spec->rel2abs( $rel_path ) ;

如果你真的需要在目录中搜索那个文件,可以使用File::Find...但是我建议使用shell命令find / -name myfile.txt -print


嗨Rainna,抱歉这不是相对路径。我尝试了上面的代码,结果返回将是我的<执行路径>/myfile.txt。 - Steven
@Steven 是的,因为 rel2abs 实际上并没有尝试查找那个文件。你觉得使用我给出的 find 命令怎么样?或者你需要严格的 Perl 解决方案吗?)那么 File::Find 就是正确的选择。 - raina77ow

24

您应该使用Perl模块Cwd来完成此操作。链接中还有一个示例,如下所示。

#!/usr/bin/perl 
use Cwd;
my $dir = getcwd;
use Cwd 'abs_path';
my $abs_path = abs_path($file);

4
这会生成一个绝对路径,但仍可能包含符号链接;例如,您可能无法得到一个指向文件所在文件系统根挂载点的路径。 - reinierpost

3
我们可以从系统的任何位置查看,但在这种情况下,我们是从“/abc/def”文件夹中查看。
$start_path = "/abc/def/";
@files = <$start_path*/myfile.txt>

foreach $file(@files) {
    print $file; # Prints the full path of the file.
}

这个程序试图匹配全局通配符/abc/def/*/myfile.txt,在大多数情况下,它只会查找def下的一级目录。看起来OP不知道它可能有多少级别的子目录。 - brian d foy

-5

在Linux中,使用pwd而不是cd来获取当前目录的路径,无需函数。

$path='cd';
$path =~ tr /\\/\//;
chomp($path);
print "$path";

2
运行如上所示的代码会导致 $path 包含字面字符串 "cd"。你是否期望 $path 包含当前工作目录? - Montgomery 'monty' Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接