2

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

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

解决方案可能是这样的:

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

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

4

3 回答 3

1

试试下面的代码:

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

输出示例:

/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
于 2012-10-08T22:24:04.387 回答
1

不解释( man bash ...)不会帮助你太多

(IFS=:; for a in $PATH; do find "$a" -type f | head -n 5; done) 2> /dev/null
于 2012-10-08T22:27:16.063 回答
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 个第一个值限制的结果

于 2012-10-10T08:26:58.700 回答