我从大学的 bash 开始,任何人都知道如何解决这个问题:
显示 $PATH 变量中每个目录的前 5 个文件,如果某个目录不存在,则不显示错误消息。
解决方案可以是这样的:
ls -a``echo $PATH | sed "s/://g"`` 2>/dev/null
它有效,也许存在其他选项,但我不知道如何将每个显示 block 的结果限制为 5?
最佳答案
尝试以下代码:
printf '%s\n' ${PATH//:/ } |
while read dir; do
/bin/ls 2>/dev/null -1 "$dir" |
head -5
done
${PATH//:/*/}
部分使用 bash parameter expansionprintf '%s\n'
正在打印换行符上以空格分隔的所有单词/bin/ls -1
在换行符上列出文件。我放置完整的路径来覆盖别名head -5
打印前 5 行
编辑
这是使用 perl
和格式化输出的另一个解决方案:
#!/usr/bin/perl -lw
use strict;
use Env qw/PATH/;
my $hash = {};
my @paths = split ":", $PATH;
push @{ $hash->{"$_"} }, glob "${_}/*" for @paths;
foreach my $key (keys(%$hash)) {
next unless $hash->{$key}->[0];
print "$key";
for (my $i = 0; $i < 5; $i++) {
my $line = $hash->{$key}->[$i];
print " $line" if $line;
}
print "\n";
}
输出示例:
/opt/kde/bin
/opt/kde/bin/checkXML
/opt/kde/bin/cupsdconf
/opt/kde/bin/cupsdoprint
/opt/kde/bin/dcop
/opt/kde/bin/dcopclient
/usr/bin
/usr/bin/2to3
/usr/bin/2to3-2.7
/usr/bin/2to3-3.2
/usr/bin/7z
/usr/bin/7za
关于BASH:从 $PATH ls 前 5 个而不显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790255/