2016-09-01 4 views
-2

Как проверить, существует ли путь/каталог (-d) и полный путь из корневого каталога?Проверьте, существует ли каталог как абсолютный путь

i.e. ~/mysubdir vs /home/me/mysubdir vs mysubdir. 
  • Я хочу аргумент в комплект поставки, чтобы умереть, если это не корневой путь, который существует. os для unix.
  • Или, если задана директория, получить полный корневой путь, если он существует?
+3

Просто некоторая терминология, которая может упростить поиск: то, что вы называете «корневым путем», обычно называется абсолютным путем, а «путь без корня» называется относительным путем. – ThisSuitIsBlackNot

+0

Абсолютный путь - это тот, который после расширения тильды начинается с косой черты. Вы можете использовать ярлык, ища тильду или косую черту, и обрабатывать недействительные расширения тильды отдельно позже в коде. – tripleee

+0

@tripleee Осторожно о тильде, не все программы интерпретируют ее как значение $ HOME. Попробуйте 'perl -MFile :: Find -e 'find (sub {print" $ File :: Find :: name \ n ";}," ~ ");'' --- ничего не печатает, но, очевидно, у меня есть файлов в '~'. – Robert

ответ

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, чтобы узнать, существует ли результирующий путь.

Смежные вопросы