BASH:从 $PATH ls 前 5 个而不显示错误

标签 bash

我从大学的 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 expansion
  • 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

关于BASH:从 $PATH ls 前 5 个而不显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790255/

相关文章:

bash - 在 UNIX 中使用 awk 或 sed 进行文本解析。提取端口号

bash - 在 Bash 中,为什么在函数中使用 getopts 只能使用一次?

C/Linux - 服务器 <-> 与命名管道的终端通信

android - 在命令行找到命令但在脚本中找不到

linux - Bash - 获取端口 ID 的脚本

mysql - 配置单元和数据库之间的健全性检查

linux - 复制带扩展名的文件并按文件名排除

linux - Bash 找到字符并删除右侧的所有字符

git - 检查bash中是否存在git分支 : weird interpolation behavior

linux - 通过 SSH 通过 STDIN 将指示器从 Bash 传回 Perl