使用Perl列出终端上的目录

时间:2017-05-02 23:31:12

标签: linux perl

我试图编写一个perl one liner来列出目录的内容,例如" ls -l"然而,Unix命令我只想输出目录而不是文件

我已经设法使用perl脚本,但我想尝试看看它是否可以使用像

这样的管道缩减为一行
ls -l | grep "something"

ls -l | perl -...

到目前为止我的方式就是这个

#!/usr/bin/perl

open(LS_D, "ls -l |");

while(<LS_D>) {
  print if /^d.*/; #print line if line starts with d
}

你也可以告诉我为什么这适用于&#34; ls -l |&#34;但不是&#34; ls -l&#34;?

由于

1 个答案:

答案 0 :(得分:4)

可以使用

直接获取目录的长列表
ls -ld */

无需过滤输出。

对于|,您可以告诉open打开流程并替换其STDINSTDOUT

  

对于三个或更多个参数,如果MODE为|-,则文件名被解释为输出要通过管道输出的命令,如果MODE为-|,则文件名被解释为命令管道输出给我们。在双参数(和单参数)形式中,应该用命令替换破折号(-)。有关此问题的更多示例,请参阅Using open() for IPC in perlipc

如果没有|,那么open(LS_D, "ls -l")就会尝试打开文件,名称为'ls -l'

推荐使用词法文件句柄的三参数open

open my $read_fh, '-|', 'ls', '-l';

其中带参数的命令作为列表提供。

最后,您在Perl脚本中拥有的内容可以通过单行完成,例如

perl -we'print grep { /^d/ } `ls -l`'

但是,如上所示,您可以在命令行上使用ls直接获取它。

我应该添加

  • 始终在程序顶部设置use warnings;use strict;

  • 请务必查看open之类的电话,了解并了解失败的原因

    open my $fh ...  or die "Can't open ... : $!";
    

    有关$!

  • 的信息,请参见Error Variables in perlvar