【问题标题】:Check if a directory exists as an absolute path检查目录是否作为绝对路径存在
【发布时间】:2016-09-01 15:16:33
【问题描述】:

如何检查路径/目录是否存在 (-d) 并且是根目录的完整路径名?

i.e. ~/mysubdir vs /home/me/mysubdir vs mysubdir. 
  • 我希望提供的参数如果不是根路径 存在。特定于 unix 的操作系统。
  • 或者,给定一个目录,如果它存在,获取它的完整根路径?

【问题讨论】:

  • 只是一些可能使搜索更容易的术语:您所说的“根路径”通常称为绝对路径,而“非根路径”称为相对路径。跨度>
  • 绝对路径是在波浪号扩展后以斜线开头的路径。您可以通过查找波浪号或斜线来进行快捷操作,并在后面的代码中单独处理无效的波浪号扩展。
  • @tripleee 注意波浪号,并非所有程序都将其解释为 $HOME 的意思。试试perl -MFile::Find -e 'find(sub { print "$File::Find::name\n"; }, "~");' --- 它什么也没打印,但很明显我在~ 中有文件。
  • 从 OP 想要支持波浪号扩展的问题看来相当清楚。如果在尚不支持的情况下需要这样做,显然他们必须自己实现。

标签: perl unix system


【解决方案1】:
use strict;
use warnings;
use feature 'say';

use Cwd qw/abs_path getcwd/;
use File::HomeDir;

my $path = 'foo/../bar';

if($path =~ /^~/) {
    my $home = File::HomeDir->my_home;
    $path =~ s/^~/$home/;
}

if($path !~ m!^/!) {
    $path = getcwd . "/$path";
}

my $full_path = abs_path($path);

if(defined $full_path && -d $full_path) {
    say "$full_path exists";
} else {
    say "$path is non-existant";
}

File::Homedir 将允许您获取用户主目录,并且您 然后可以替换路径中的波浪号。

如果此时的路径不是以/ 开头(是相对路径),则在当前工作目录前加上getcwd,以获得绝对路径。

完成后,您可以将其传递给abs_path 以解析... 以及符号链接等问题。

最后,您可以使用-d 对其进行测试,以查看生成的路径是否存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2020-05-08
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多