ls:一致するパターンが1つしかない場合は、ディレクトリ名を表示します。

ls:一致するパターンが1つしかない場合は、ディレクトリ名を表示します。

パターンに一致するファイルを表示するために使用される場合、複数の一致する項目があるls場合はディレクトリ名とその内容が表示されますが、一致する項目が1つしかない場合はディレクトリ名は省略されます。例は次のとおりです。

example % ls
bar     barbados    foo

example % ls b*
bar:
1   2

barbados:
1   2

example % ls f*
1   2

例では、b*両方のディレクトリで一致するエントリから始まるすべてのファイルが要求され、出力には両方のディレクトリの名前とその内容が表示されます。

出力を要求すると、一致f*する単一ディレクトリの内容が表示されますが、ディレクトリ名は省略されます。

ls単一のディレクトリのみが一致する場合は、一致するディレクトリ名の表示を設定する方法は?

答え1

考えられる解決策は、関数をラップすることです。

dls() {
    if [ "$#" -eq 1 ] && [ -d "$1" ]; then
        printf '%s:\n' "$1"
    fi
    ls -- "$@"
}
  • 上記の関数は引数として渡されたオプションを受け入れません。
  • 次の点のみを確認してください。
    1. 単一のパラメータ
    2. パラメータはディレクトリです。

これら2つの条件がtrueの場合、ディレクトリの内容を一覧表示する前にディレクトリ名が印刷されます。


% dls f*
foo:
1   2

一部の実装では、最新バージョンのGNUがスペースやその他の特殊文字を含むときに実行するのと同様の方法で、ディレクトリ名を参照printfしてディレクトリ名を置き換えることができます。%s%qls

答え2

例を使用すると、 を実行するとls b*シェルがb*に拡張されるので、bar barbados実際にls bar barbados。引数が複数ある場合、lsそのうちの1つがディレクトリの場合、名前とディレクトリにあるファイルのリストが印刷されます。

を実行するとls f*シェルがf*に拡張されるので、foo実際に実行しますls foo。引数が1つしかない場合、引数がlsディレクトリの場合は、ディレクトリ名なしでディレクトリ内のファイルのリストを印刷します。

私が望むことを行うための「良い」方法はありませんls(少なくとも私が知っている限り、他の人はもっとよく知っているでしょう)。 「あまり良くない」アプローチは、絶対に存在しない追加のパラメータを含めてから、存在しないファイルに関連するエラー出力をフィルタリングすることです。続けて記録します。出力を解析するlsのは悪い考えですが、役に立つ場合に備えて次のようにします。

$ function dls() {
    if [[ $# -eq 0 ]]; then
        ls
    else
        ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
    fi
}

$ dls
foo

$ dls f*
foo:
1  2

これを行うと、意図しない結果が発生する可能性があります(たとえば、通常どおり標準エラーメッセージをリダイレクトできない可能性があります)。

答え3

-alほとんどの人が毎回使用するパラメータを使用してください。lsこれにより、ディレクトリ名に末尾のスラッシュを追加するまでこれは行われません。もう一つのパラメータはです-d。これにより、何らかの方法で動作が中断されることはありません。

永久に維持するには、.bashrcホームディレクトリに次のように入力します。

alias lsd='ls -d' ;

lsd後でこのコマンドを使用できます。

関連情報