BASH:来自$ PATH的前5名没有显示错误

时间:2012-10-08 22:17:16

标签: bash

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

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

解决方案可以是:

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

它有效,也许还有其他选项,但我不知道如何将每个显示块的结果限制为5个?

3 个答案:

答案 0 :(得分:1)

请尝试以下代码:

printf '%s\n' ${PATH//:/ } |
    while read dir; do
        /bin/ls 2>/dev/null -1 "$dir" |
            head -5
    done
  • ${PATH//:/* /}部分使用bash parameter expansion
  • printf '%s\n'正在打印在换行符上用空格分隔的任何字词
  • /bin/ls -1列出换行符的文件。我将完整的PATH覆盖别名
  • 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

答案 1 :(得分:1)

不解释(man bash ...)

,对你没有多大帮助
(IFS=:; for a in $PATH; do find "$a" -type f | head -n 5; done) 2> /dev/null

答案 2 :(得分:0)

这应该有用,看看:

#!/bin/bash

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

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

命令IFS = .....将$ PATH变量拆分为数组,然后循环显示结果限制为5个第一个值的数组