我是从大学的bash开始的,任何人都知道如何解决这个问题:
从$ PATH变量显示每个目录的前5个文件,如果某个目录不存在,则不显示错误消息。
解决方案可以是:
ls -a ``echo $PATH | sed "s/:/ /g"`` 2> /dev/null
它有效,也许还有其他选项,但我不知道如何将每个显示块的结果限制为5个?
答案 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个第一个值的数组