【问题标题】:List absolute path for folder in Linux and Perl列出 Linux 和 Perl 中文件夹的绝对路径
【发布时间】:2017-01-17 06:38:55
【问题描述】:

我有一个文件夹,里面包含两个文件夹,如下所示:

/vobs/code
/vobs/code/item
/vobs/code/image

我想获取它的两个文件夹的绝对路径。在我的 perl 脚本中,我的代码如下所示。

@folder = `cd /vobs/code/item;ls -d $PWD/**`; or 
@folder = `cd /vobs/code/item;ls -d $PWD/*`;

从网上说,使用两个通配符它将显示文件和目录,而一个通配符显示文件夹,但我在控制台中尝试过它提供的文件和文件夹也带有或额外的一个通配符。

执行 perl 脚本后得到的结果,它没有给出 /vobs/code 中的文件夹路径。而是显示根文件夹路径。我在 cd 和 ls 之间放了一个密码,密码显示它实际上cd 到目录并执行下一个命令。

@folder = `cd /vobs/code/item;ls -d $pwd/*`

上面的命令产生与第一个和第二个命令相同的输出,因为 pwd 是小写的,它显示根文件夹路径。

我试过 readlink -f 但它需要文件夹名,否则会提示错误。我可以尝试获取文件名和 pwd 路径并将其加入成为变量,但这有点麻烦,我会接受如果我找不到任何解决方案,作为最后的手段。请帮助谢谢

【问题讨论】:

  • 阅读this information。更具体地说,搜索rel2abs()
  • 仅作记录:当您决定编写 PERL 脚本时,您可能会以几乎与平台无关的方式进行。含义:perl 有其用于查看文件系统的库。因此,不要发出系统命令;我建议您改用 perl 库的强大功能。
  • 一个简单的谷歌搜索relative to absolute path perl会引导你到那个。

标签: linux perl shell unix


【解决方案1】:

您可以使用glob 来扩展通配符。使用grep 过滤列表,-f-d(参见-x)分别检查文件和目录。

my @files_and_directories = glob '/vobs/code/*'; 
my @files       = grep -f, @files_and_directories;
my @directories = grep -d, @files_and_directories;

【讨论】:

    【解决方案2】:

    你考虑过 abs_path 吗?

    use Cwd 'abs_path';
    my $base_path = abs_path('vobs/code');
    for my $dir ( qw/item image/ ){
       my $path = abs_path(join("/",$base_path,$dir));
       # Ofc, this will only work if vobs/code is in working directory.
       my @files_in_dir = grep{ -f $_ }<$path/*>; # these will be absolute
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 1970-01-01
      • 2011-03-21
      • 2012-05-09
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2012-05-08
      相关资源
      最近更新 更多