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


44

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ファイルとディレクトリの代わりにディレクトリのみを表示する方法はありますか?


17
lsd 非常に混乱する可能性があります。
boehj

2
@jin ls -d * /動作します。しかし、なぜ私が望む出力を得るために「* /」をしなければならないのですか。
ネラロ

8
@nelaar -dはディレクトリのみをリストすることを意味するのではなく、ディレクトリの内容をリストしないことを意味します。入力ls */してみると、すべてのディレクトリの内容が表示されます。
ジン

2
私がしているldirにalised ls -d */私に.bashrc...これを容易にするために
DQdlM

1
lsは大量の情報を提供できますが、ディレクトリを表示するための1つのフラグではありません...
DimiDak

回答:


50

あなたの期待はDOS Think / Windows Thinkに基づいており、間違っています。MS-DOS、Windows、および実際には他のいくつかのIBM / Microsoftオペレーティングシステムでは、ワイルドカード拡張はコマンド自体によって行われ、コマンドの/aオプションなどはdirワイルドカード拡張時に属性フィルターとして機能します。 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 ではありません「ディレクトリだけを印刷する」オプションを選択します。実際、そのようなオプションがないだけではありません。そのようなオプション存在できません。ワイルドカードの展開はシェルによって行われ、(sh少なくともPOSIXでは)シェル*が名前のリストに展開するときに許可とファイルタイプビットをチェックするように指示する方法はありません。単独のディレクトリの名前のリストを取得するには、それが必要であるのいずれかを使用するfindことで説明したように、コマンドをztank1013、またはスラッシュで終わるパス名は、ディレクトリエントリを意味していることのトリックを使用する.ことで説明したように、Jin。(Jinのトリックは、lsコマンドが引数を受け取ることになります

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

パターンがあるため*/二つの成分を有する事実マッチングパス名であり、第二ビーイングは空などされていない非常に望まれていた何を。特に、ディレクトリを指しているシンボリックリンクをディレクトリであるかのように扱います。

ls -dなしの動作は*、上記の単純な拡張です。一つは、単にに関するもう一つのことを知っている必要がありls、それは引数を与えられていない場合、それはデフォルトの引数を想定していました:.。さてなし-dオプションで指定されたディレクトリの内容に、前述の行動リードが.列挙され、その内容についての情報が表示さ。 では-dオプション、ディレクトリは.それがファイルであるかのように扱われ、独自の情報は、その内容を列挙するのではなく、表示されています。


3
「そのようなオプションあり得ません」-それはかなり強力なステートメントです-そのようなオプションの実装は明白です:非ディレクトリ引数を見て、それを無視してください。何をすることはできません実装することは相当であるdir /s *.txt[検索用としてワイルドカードを引用に頼ることなく]
Random832

6
正しいですが、引数として渡されたアイテムをフィルターで除外するオプションをls 持つことができないという論理的な理由はありません。これは何も持っていないので、「ワイルドカードの展開は、エントリの型チェックから離婚された」という事実は、無関係であるすべてのエントリのみの型チェック、それが出来ない理由はありません-ワイルドカードの展開を行うには、完全に LSの中を。ls --colorがそれらを青にシェーディングでき、ls -Fがそれらの後に/を置き、ls -lがモードに「d」を置くことができる場合、他の仮想オプションはそれらを省略できます。そのようなオプションが存在しないということは、「できない」という意味ではありません
Random832

5
Random832はまともなポイントになります:ls 可能性フィルタファイルまたはディレクトリへのオプションがあり、これはシェルが展開を行う持つと相互に排他的ではありません。lsには競合状態はありません。通常のファイルを統計するので、フィルタリングできます。(シェル拡張とls、FWIWとの間にはすでに競合があります。)シェル拡張は、その理由の一部に過ぎないと思います。 、mvなど。Unixは「1つのことをして、それをうまくやる」。高度なフィルタリングが必要な場合、そのためのツールがあります。
タナトス

2
このls -pオプションは、/ディレクトリにのみシンボルを追加します。出力印刷機能を、(ではなくls -p | grep /)これらのみを出力するもので拡張しない理由はありません。
アンヴァンロッサム

3
@ JdeBP、ad-hominem攻撃( "kiddo")および慢(あなた以外の誰もが "Unixの基礎"を知らない)は技術的な議論に属しません。さらに、コマンドオプションではシェルによって行われるワイルドカード展開を制御できないと主張するとき、あなたはストローマンを引っ張っています。もちろん、できません!Random832も、Thanatosも、Anne van Rossumも、質問自体でさえワイルドカードに言及していません。反対は、最終的にls --only-directories .オプションを追加できるということでしたls
mkalkov

30

ls -d */、またはls -d .*/隠しディレクトリに使用できます。


/を使用した巧妙なトリック
モノラル

うん、これはいい。これが機能しないケースはありますか?
-iyrin

5
+1は1行で回答を提供します。どこかで受け入れられた答えもあると思います。
微積分の騎士

既にディレクトリにいなくても、スクリプトでこれを使用するにはどうすればよいですか?
DimiDak

13

これを試して

 find . -mindepth 1 -maxdepth 1 -type d

現在の場所にあるディレクトリだけを取得します。


5

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

tree -d 

ツリー構造をグラフィカルに表示して、すべてのディレクトリとサブディレクトリをきれいにリストします。


3
そして唯一のレベルの深さのために:tree -dL 1
アン・バン・ロッサム

残念ながら、ツリーとあまり組み合わせることができません。#ツリー-d | grep wc -l(標準入力)
DimiDak

5

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

find -maxdepth 1 -type d -ls;

上記は、-lオプションで得られるような詳細のみを提供します。


1
find -maxdepth 1 -type d -exec ls -d {} +通常のls形式で出力を取得するために使用することをお勧めします。
mkalkov

4

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

ls -l | grep ^d

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


1
これはディレクトリ以上のものを除外します。
オコド

2
@Slomojo、これはディレクトリ以外のすべてを除外します。どういう意味?
mkalkov

うん、許可を得るには-l(長い)が必要です。ディレクトリの「d」。さらに、ディレクトリエントリの「長い」リストを取得できます。
geoO 16

1

これがあなたのニーズを修正することを願っています。以下のコマンドは、指定されたパスのディレクトリのみをリストします。

ls -F <path> | grep /

例:

ls -F ~ | grep /
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.