BASH:ls$PATH中的前5个,不显示错误

BASH:ls$PATH中的前5个,不显示错误,bash,Bash,我从大学的bash开始,任何人都知道如何解决这个问题: 显示$PATH变量中每个目录的前5个文件,如果某个目录不存在,则不显示错误消息 解决方案可以是: ls-a``echo$PATH|sed“s/://g``2>/dev/null 它可以工作,可能还有其他选项,但我不知道如何将每个显示块的结果限制为5个?请尝试以下代码: printf '%s\n' ${PATH//:/ } | while read dir; do /bin/ls 2>/dev/null -1 "

我从大学的bash开始,任何人都知道如何解决这个问题:

显示$PATH变量中每个目录的前5个文件,如果某个目录不存在,则不显示错误消息

解决方案可以是:

ls-a``echo$PATH|sed“s/://g``2>/dev/null


它可以工作,可能还有其他选项,但我不知道如何将每个显示块的结果限制为5个?

请尝试以下代码:

printf '%s\n' ${PATH//:/ } |
    while read dir; do
        /bin/ls 2>/dev/null -1 "$dir" |
            head -5
    done
  • ${PATH/://*/}
    部件使用
  • printf“%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";
}

不解释也不会帮你太多忙(…)


这应该可以,看看:

#!/bin/bash

IFS=':' read -a array <<<"$PATH"

for i in "${array[@]}"; do
ls -al $i 2>/dev/null | head -5
done
#/bin/bash

IFS=':'读取数组名称的前五个?尺寸?原始目录位置?时间?我假设您想要点文件(
ls-a
),但是您想要“.”和“…”?没有提到这一点,因此它可以默认为名称,其想法是只列出5个结果限制的结果,而不需要
IFS
&无需
()
:生成子shell的。所以:
{IFS=:对于$PATH中的a;请在意外标记“do”附近查找“$a”-键入f | head-n 5;done;}2>/dev/null
@sputnick
语法错误。还有,你为什么这么说?这不是一个高尔夫球,因为
{}
是最后需要的。我这么说是因为在这种情况下使用子shell会导致不必要的开销。@sputnick我在使用您的变量时会得到错误。你试过了吗?(顺便问一下,如果根本不需要子shell,为什么要使用
{}
(IFS=:; for a in $PATH; do find "$a" -type f | head -n 5; done) 2> /dev/null
#!/bin/bash

IFS=':' read -a array <<<"$PATH"

for i in "${array[@]}"; do
ls -al $i 2>/dev/null | head -5
done