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改行でファイルをリストします。エイリアスを上書きするために完全な 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
于 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 に答える