私は大学で bash から始めています。誰もがその問題を解決する方法を知っています:
$PATH 変数から各ディレクトリの最初の 5 つのファイルを表示します。ディレクトリが存在しない場合は、エラー メッセージを表示しません。
解決策は次のようになります。
ls -a ``echo $PATH | sed "s/:/ /g"`` 2> /dev/null
動作します。他のオプションが存在する可能性がありますが、各ショー ブロックごとに結果を 5 に制限する方法がわかりません。
私は大学で bash から始めています。誰もがその問題を解決する方法を知っています:
$PATH 変数から各ディレクトリの最初の 5 つのファイルを表示します。ディレクトリが存在しない場合は、エラー メッセージを表示しません。
解決策は次のようになります。
ls -a ``echo $PATH | sed "s/:/ /g"`` 2> /dev/null
動作します。他のオプションが存在する可能性がありますが、各ショー ブロックごとに結果を 5 に制限する方法がわかりません。
次のコードを試してください:
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
説明しないことであまり役に立ちません(man bash ...)
(IFS=:; for a in $PATH; do find "$a" -type f | head -n 5; done) 2> /dev/null
これはうまくいくはずです、見てください:
#!/bin/bash
IFS=':' read -a array <<<"$PATH"
for i in "${array[@]}"; do
ls -al $i 2>/dev/null | head -5
done
コマンド IFS=..... $PATH 変数を配列に分割し、最初の 5 つの値で制限された結果を表示する配列をループします