web-dev-qa-db-ja.com

コマンド「ls -d」はディレクトリを表示していません。ファイルやディレクトリではなくディレクトリのみを表示する「ls」を取得する方法はありますか?

lsにファイルやディレクトリではなくディレクトリのみを表示させる方法はありますか?

Manページから:

   -d, --directory
          list directory entries instead of contents, and do not  derefer‐
          ence symbolic links

したがって、/ディレクトリディレクトリのみが表示されることを期待しています。代わりに「。」が表示されます。

$ cd /
$ ls -d
.

私は期待していました ls -dこれを表示するには:

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

lsにファイルやディレクトリではなくディレクトリのみを表示させる方法はありますか?

44
nelaaro

あなたの期待はDOS Think/Windows Thinkに基づいており、間違っています。 MS-DOS、Windows、および実際には他のいくつかのIBM/Microsoftオペレーティングシステムでは、ワイルドカード拡張はコマンド自体によって行われ、dirコマンドの_/a_オプションなどは属性フィルターとして機能しますワイルドカード展開中。 dirは、コマンドインタープリターがそのままワイルドカードに渡す_*_のようなワイルドカードを展開します。_/a_が指定されている場合は、返されるものに適切なフィルターを適用します。 (一部のオペレーティングシステムでは、ディレクトリを列挙するためのシステムコールに属性フィルターを与えることができ、オペレーティングシステムカーネルまたはそのファイルシステムドライバーがそれ自体を適用します。)

UnicesとLinuxでは、ワイルドカードの展開はシェルによって行われ、アクセス許可は認識されません。ルートディレクトリで、

ls *

シェルからlsコマンド自体が受け取るもの(何か)

ls bin home opt var boot dev tmp etc lost + found root usr

_-d_/_--directory_オプションの機能は、通常は次に行われる処理をオフにするです。次に通常発生するのは、lsが各引数を順番に調べ、それらがディレクトリであることを確認し、その内容を列挙することを決定することです。ファイルに名前を付ける引数の場合、ファイル自体の情報を出力するだけです。 _-d_オプションを使用すると、ディレクトリはファイルのように扱われます。したがって、lsは、ファイルの場合と同様に、引数として渡された各ディレクトリの情報を出力します。

したがって、_-d_ ではないは、「ディレクトリのみを印刷する」オプションです。実際、そのようなオプションがないだけではありません。そのようなオプションはありません。ワイルドカードの展開はシェルによって行われ、(少なくともPOSIX shでは)_*_を名前のリストに展開するときに、シェルにアクセス許可とファイルタイプビットをチェックするように指示する方法はありません。ディレクトリ名のみのリストを取得するには、_ztank1013_で説明されているようにfindコマンドを使用するか、スラッシュで終わるパス名がディレクトリを意味するというトリックを使用する必要があります。エントリJinで説明されている_._。 (Jinのトリックは、lsコマンドが引数を受け取ることで終わります

ls bin/home/opt/var/boot/dev/tmp/etc/lost + found/root/usr /

パターン_*/_は実際にはパス名と2つのコンポーネントが一致し、2番目のコンポーネントは空であるため、quiteが望んだことを実行しないためです。特に、ディレクトリを指すシンボリックリンクを、あたかもディレクトリであるかのように扱います。)

_ls -d_なしの_*_の動作は、上記の単純な拡張です。 lsについてもう1つ知っておく必要があります。引数を指定しない場合、デフォルトの引数は_._と見なされます。 _-d_オプションをなしにすると、前述の動作により、_._で指定されたディレクトリの内容が列挙され、その内容の情報が表示されます。 With_-d_オプションを使用すると、ディレクトリ_._はファイルのように扱われ、列挙された内容ではなく、独自の情報が表示されます。

50
JdeBP

あなたは使うことができますls -d */、またはls -d .*/隠しディレクトリ。

30
Jin

これを試して

 find . -mindepth 1 -maxdepth 1 -type d

現在の場所の下のディレクトリのみを取得します。

13
ztank1013

ls -l(ELL)オプションのような詳細のみでディレクトリを表示したい場合は、以下を使用できます。

find -maxdepth 1 -type d -ls;

上記では、-lオプションで取得できるような詳細のみが表示されます。

5
Adnan Bhatti

あなたはおそらくそれも好きでしょう

tree -d 

すべてのディレクトリとサブディレクトリがツリー構造のグラフィカルな描写とともにきちんと一覧表示されます。

5
fuenfundachtzig

別の方法で仕事をしたい場合は、これを試してください:

ls -l | grep ^d

この状況では単一のツールで十分ですが。パイプラインは常にあなたを助けるためにあります。 Linuxの柔軟性が気に入っています。

4
Bohr

これがあなたの必要性を正してくれることを願っています。以下のコマンドは、指定されたパスのディレクトリのみを一覧表示します。

ls -F <path> | grep /

例:

ls -F ~ | grep /
1
Thiyagu ATR