ls -ad */ は隠しディレクトリを表示しません。

ls -ad */ は隠しディレクトリを表示しません。

pwd私のホームディレクトリです。ls */ -dディレクトリを表示します。

~$ ls */ -d
Blog/  Desktop/  Documents/  Downloads/  Music/  Pictures/  Public/  Templates/  Videos/

ls -a隠しディレクトリとファイルの両方を表示します。隠しディレクトリ.cache-.localなど

$ ls -a
.                        .cache      .gnupg       .xsession-errors.old
..                       .config     .gtkrc-2.0   Templates
.bash_history            Desktop     .gtkrc-xfce  Pictures      .themes
.bash_logout             .linuxmint   .pki          Videos
.bashrc                  Documents   .local       .profile      .viminfo
Blog                     Downloads   .mozilla     Public        .Xauthority
Music        .ssh          .xsession-errors

ただし、実行するとls -ad */非表示のディレクトリは表示されません。誰でも説明できますか?

$ ls -ad */ 
Blog/  Desktop/  Documents/  Downloads/  Music/  Pictures/  Public/  Templates/  Videos/

答え1

を実行すると、ls -aコマンドラインにファイル名がないためls(図を参照ls)、どのファイル名を一覧表示する必要があるかを独自に識別します。指定された後に「隠された」ファイル表示が含まれます-a

ls -d */andを実行すると、ls -ad */シェルが展開され、表示される*/ファイル名のリストを提供しますls*ファイル名パターンの開始が一致しません。.そのため、隠しファイルは含まれません。と*/組み合わせて使用​​すると、ここでは何の効果もありません。-d-a

隠しディレクトリを表示するには、そのディレクトリを明示的に一覧表示できますls -d -- */ .*/。一部のシェルでは、隠しファイルの一致を要求する場合があります*。たとえば、Bash では次のように使用します (この場合は と がshopt -s dotglob含まれていないため、 と同様に動作します )。...ls -A

また、--ファイル名がで始まる場合は、オプションと見なされないようにオプションの終わりを表示することを忘れていました-*/目次も含まれています。とディレクトリシンボリックリンク。を使用すると、各ファイルに末尾を追加せずにディレクトリ(隠しディレクトリを含む)のみを一覧表示zshできます。または、ディレクトリへのシンボリックリンクが本当に必要な場合。ls -d -- *(D/)D/*(D-/)

答え2

* 意図的にほとんどの場合、私たちが望むものなので(ドットファイルとディレクトリは通常データではなく設定に使用されるため)、隠されたファイルやディレクトリと一致せず、.if / Worthで始まるglobを明示的に指定してデフォルトを上書きします。できます。必要に応じて使用してください。

globで一致させたい場合ls -d .*(またはls -d .*/通常のファイルなしで隠されたディレクトリのみを一致させるには)を使用します。非表示のディレクトリと非表示のディレクトリを一致させるには、次のようにします。ls -d -- */ .*/

注:@rexkogitansがコメントで述べたように、グローブは*シェルによって拡張されたものと同じです。今後彼らはプログラムに渡されます。または(または)lsが表示されず、globのシェル拡張の結果であるファイルおよび/またはディレクトリ名のリストが表示されます。これがプログラムに文字列リテラルとして渡したい場合は、グローバル文字を引用するか、エスケープ(バックスラッシュをプレフィックスとして使用する)が必要な理由です。*.*.*/

また、注:globに一致するファイル/ディレクトリがない場合、globは拡張されていない状態でプログラムに渡されます(つまり、引数 lsとして扱われます)。 (および他のいくつかのbourne様シェル)では、この動作を無視できます。たとえば、bashでは、シェルオプションを使用できます。 nullglobを使用すると空の状態に拡張(つまり引数リストから削除)されますが、Failglobはエラーをトリガーします。*bashnullglobfailglob

答え3

どこでもよく説明されていない短い答えは、inを使用するとき/が無視されることですls。なぜなら、/はディレクトリの内容が表示(表示)され、渡される方法を制御するからです。-a-A-d-a-Als-dいいえディレクトリの内容を一覧表示します。

関連情報