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*2 つのディレクトリが一致し、出力には両方のディレクトリの名前とその内容が表示されます。

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

ls一致するディレクトリが 1 つだけの場合、一致するディレクトリの名前を表示するように設定するにはどうすればよいですか?

答え1

回避策としては、ラッパー関数が考えられます。

dls() {
    if [ "$#" -eq 1 ] && [ -d "$1" ]; then
        printf '%s:\n' "$1"
    fi
    ls -- "$@"
}
  • 上記の関数は引数として渡されるオプションを受け入れません
  • 以下の点を確認するだけです:
    1. 議論は一つだけである
    2. 引数はディレクトリです

これら 2 つの条件が満たされている場合は、ディレクトリの内容を一覧表示する前にディレクトリの名前を出力します。


% dls f*
foo:
1   2

一部のprintf実装では、ディレクトリ名に空白やその他の特殊文字が含まれている場合に、GNU の最新バージョンと同様に、ディレクトリ名を引用符で囲むために%sをに置き換えることができます。%qls

答え2

あなたの例を使用すると、 を実行するとls b*、シェルはb*を に展開するbar barbadosので、実際には が実行されますls bar barbadoslsに複数の引数がある場合、そのうちの 1 つがディレクトリであれば、名前に続いてディレクトリ内のファイルのリストが出力されます。

を実行するとls f*、シェルはf*を に展開するfooので、実際には が実行されますls foolsに引数が 1 つある場合、その引数がディレクトリであれば、ディレクトリ内のファイルのリスト (ディレクトリ名なし) が出力されます。

望むことを行うための「良い」方法と呼べるものはありませんls(少なくとも私が知っている限りでは、他の誰かがもっと良い方法を知っているかもしれません)。1 つの「あまり良くない」方法は、存在しないことがわかっている追加の引数を含め、存在しないファイルに関連するエラー出力をフィルターすることです。 の出力を解析するのは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ほとんどの人がいつも使用する パラメータを使用します。 lsdirname に末尾のスラッシュを追加するまでは、このパラメータは使用されません。 他のパラメータは ですが-d、その場合はいかなる方法でも下降しません。

.bashrc永続的に保存したい場合は、ホーム ディレクトリ内に次の内容を入力します。

alias lsd='ls -d' ;

このコマンドはlsd将来も使用できます。

関連情報