我试图编写一个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;?
由于
答案 0 :(得分:4)
可以使用
直接获取目录的长列表ls -ld */
无需过滤输出。
对于|
,您可以告诉open打开流程并替换其STDIN
或STDOUT
对于三个或更多个参数,如果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 ... : $!";
有关$!