Bashでlsを使用してディレクトリのみを一覧表示しますか?


954

このコマンドは、現在のパスにあるディレクトリを一覧表示します。 ls -d */

パターン*/は正確に何をしますか?

そしてls -d /home/alice/Documents、そのパスのディレクトリのみを一覧表示するために、上記のコマンド(たとえば)で絶対パスをどのように指定できますか?


7
この回答の編集を参照してくださいunix.stackexchange.com/a/75047/32647-d実際の意味を説明します。
Evgeni Sergeev 2013

回答:


992

*/は、現在のディレクトリ内のすべてのサブディレクトリに一致するパターンです(*すべてのファイルサブディレクトリに一致します。これはディレクトリに/制限されます)。同様に、/ home / alice / Documentsの下のすべてのサブディレクトリを一覧表示するには、次を使用します。ls -d /home/alice/Documents/*/


88
*/隠しフォルダとは一致しないことに注意してください。それらを含めるには、のようls -d .*/ */に明示的に指定するか、Bashでオプション設定しdotglobます
Gergő

1
@ytpillaiリストするサブディレクトリがないため、このようなことが起こっています。ls存在しないものに使用すると、いつでもそのエラーが発生します。
Gordon Davisson、2015

1
申し訳ありませんが、たった今チェックしたところ、唯一のディレクトリがルートフォルダであることがわかりました。
ytpillai 2015

1
@GordonDavisson失敗のメッセージはbashオプションで回避できるshopt -s nullglob

4
@BinaryZebra nullglobを設定するとエラーメッセージは回避されますが、さらに混乱が生じます。nullglobが設定されており、サブディレクトリls */がないls場合は、現在のディレクトリ内のすべてのファイルをリストするだけに展開されます。それはあなたがその場合あなたが望むものではないことはかなり確信しています。
ゴードンデイヴィッソン、

481

これを実行する4つの方法、それぞれ異なる出力形式

1.使用 echo

例:echo */echo */*/
ここに私が得たものがあります:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. lsのみを使用する

例:ls -d */
これが私が得たものです:

cs/     files/      masters/  
draft/  hacks/      static/  

またはリストとして(詳細情報付き): ls -dl */

3. lsおよびの使用grep

例:ls -l | grep "^d" ここに私が得たものがあります:

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bashスクリプト(スペースを含むファイル名には推奨されません)

例:for i in $(ls -d */); do echo ${i%%/}; done
ここに私が得たものがあります:

cs  
draft  
files  
hacks  
masters  
static

終了文字として「/」を使用する場合、コマンドは次のようになります。 for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/

2
NB。 3私にとって他のものよりも著しく遅い。テストしたディレクトリ:1.012s、2.016s、3 .055s4.021s。
同型写像

@同型、時間をどのように測定しましたか?どういう意味ですか?ちなみに、いちばん1好きです。
アルバート

アルバート、私timeはUnix関数を使用しました。私は同意する///、echo */より賢いですls -d */
同型写像

9
注意すべき2つのマイナーな点。ls -l | grep "^ d"はディレクトリへのシンボリックリンクを除外しますが、 'ls -d * /'はそれらを表示します。また、ターゲットディレクトリにディレクトリがまったく存在しない場合、「ls -d * /」は失敗します。
Zoran Pavlovic 2014年

15
この1.オプションは、スペースが含まれるフォルダ名を処理するときに大きな問題を引き起こします。
Shrikant Sharat、2014

99

私が使う:

ls -d */ | cut -f1 -d'/'

これにより、末尾にスラッシュがない単一の列が作成されます-スクリプトで役立ちます。

私の2セント。


18
-1オプションはls、同様に単一列形式で出力しますls -1 -d */
カリン

3
@ user29020は-1、すべてのエントリに対して引き続きスラッシュを出力することに注意してください。
Dennis

これを.bashrcエイリアスとして追加する場合、どのように追加し'/'ますか?
RNA

@RNAの回答は遅いですが、将来の人々のために:バックスラッシュでエスケープしてみませんか?'\/'
Caek

1
先頭にスラッシュがある場合は中断します。これは、末尾のスラッシュを削除します| sed -e 's-/$--'
ビクターSergienko

62

サブフォルダーのないすべてのフォルダー:

find /home/alice/Documents -maxdepth 1 -type d

すべてのフォルダの場合サブフォルダ:

find /home/alice/Documents -type d

2
質問に一致するには(ただし、ドットファイルを含める)、1つ目は次のようにする必要があります。find /home/alice/Documents -maxdepth 1 -mindepth 1 -type dそれ以外の場合は、/home/alice/Documents自分自身を含めます。ディレクトリへのシンボリックリンクを含めるには、プレフィックスを-L
jhnc

findはこのタスクのために実際に作成されたツールであるため、これは最も健全なソリューションのようです。最初の結果(現在のディレクトリの./)を除外するには、grep -v '^ \ ./$'にパイプします。
siliconrockstar

38

4(詳細)信頼できるオプション。

引用符で囲まれていないアスタリスクは、*シェルによってパターン(グロブ)として解釈されるであろう。
シェルはパス名の展開でそれを使用します。
次に、パターンに一致するファイル名のリストを生成します。
単純なアスタリスクは、PWD(現在の作業ディレクトリ)内のすべてのファイル名に一致します。で終わるすべてのファイル名に一致
するような、より複雑なパターン。したがって、すべてのディレクトリ。そのため、コマンドは次のとおりです。*//

1.-エコー。

echo */
echo ./*/              ### avoid misinterpreting filenames like "-e dir"

echoPWD内のすべてのディレクトリに(シェルによって)展開されます。


これをテストするには:mkdirtest-dirのような名前のディレクトリ()を作成し、cdそこに入れます。

mkdir test-dir; cd test-dir

いくつかのディレクトリを作成します。

mkdir {cs,files,masters,draft,static}   # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces}  # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename'    # and some files:

echo ./*/奇妙な名前のファイルがあっても、コマンドは信頼できるままです。

./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/

ただし、ファイル名にスペースが含まれていると、読みにくくなります。


の代わりにechoを使用した場合lsでも、シェルはファイル名のリストを拡張するものです。シェルがPWDのディレクトリのリストを取得する理由です。-dオプションlsになり、それは(デフォルトで提示される)の代わりに、各ディレクトリの内容の現在のディレクトリエントリをリストします。

ls -d */

ただし、このコマンドは(ある程度)信頼性が低くなります。上記の奇妙な名前のファイルで失敗します。それはいくつかの名前で窒息します。問題のあるものを見つけるまで、1つずつ消去する必要があります。

2.- ls

GNU lsは「オプションの終わり」(--)キーを受け入れます。

ls -d ./*/                     ### more reliable BSD ls
ls -d -- */                    ### more reliable GNU ls

3.-printf

各ディレクトリを(ls -1のように1列で)1行にリストするには、次のコマンドを使用します。

$ printf "%s\n" */        ### Correct even with "-", spaces or newlines.

そして、さらに良いことに、末尾を削除でき/ます:

$ set -- */; printf "%s\n" "${@%/}"        ### Correct with spaces and newlines.

このような試み:

$ for i in $(ls -d */); do echo ${i%%/}; done

失敗します:

  • ls -d */すでに上に示したいくつかの名前()。
  • の値の影響を受けますIFS
  • スペースとタブで名前を分割します(デフォルトではIFS)。
  • 名前の各改行は、新しいエコーコマンドを開始します。

4.-機能

最後に、関数内で引数リストを使用しても、現在実行中のシェルの引数リストには影響しません。単に:

$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs

このリストを提示します:

--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var

このオプションは、いくつかのタイプの奇妙なファイル名で安全です。


Safeという単語をReliableに置き換えてください。(。脆弱または攻撃可能)あなたの投稿は、私は他のソリューションは、「安全ではない」と思います
アマドマルティネス

1
@AmadoMartinez一般的なs / safe / reliable /を実行しました。いい?

21

このtreeコマンドはここでもかなり便利です。デフォルトでは、すべてのファイルとディレクトリが完全な深さまで表示され、いくつかのASCII文字がディレクトリツリーを示します。

$ tree
.
├── config.dat
├── data
   ├── data1.bin
   ├── data2.inf
   └── sql
|      └── data3.sql
├── images
   ├── background.jpg
   ├── icon.gif
   └── logo.jpg
├── program.exe
└── readme.txt

しかし、ASCIIツリーなしで、現在のディレクトリからの完全パスを使用して、ディレクトリのみを取得したい場合は、次のようにできます。

$ tree -dfi
.
./data
./data/sql
./images

引数は次のとおりです。

-d     List directories only.
-f     Prints the full path prefix for each file.
-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

そして、絶対パスが必要な場合は、現在のディレクトリへのフルパスを指定することから始めます。

$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

また、サブディレクトリの数を制限するには、サブディレクトリの最大レベルをで設定できます-L level。例:

$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images

manツリーでより多くの議論が見られます


15

なぜ 'ls -d * /'からの出力が次のような2つの末尾スラッシュを与えるのか疑問に思っている場合は、

[prompt]$ ls -d */    
app//  cgi-bin//  lib//        pub//

これはおそらく、シェルまたはセッション構成ファイルのどこかに、-Fフラグを含むバージョンのlsにlsコマンドのエイリアスを設定しているためです。このフラグは、各出力名(プレーンファイルではない)に文字を追加して、その種類を示します。したがって、1つのスラッシュはパターン「* /」に一致するfromであり、もう1つのスラッシュは追加された型インジケーターです。

この問題を取り除くために、もちろん、lsに別のエイリアスを定義することができます。ただし、一時的にエイリアスを呼び出さないようにするには、コマンドの前にバックスラッシュを付けます。

\ ls -d * /


11

これを自分の.bashrcファイルに追加するだけです(1つのセッションで必要な場合のみ、コマンドラインで入力することもできます)。

alias lsd='ls -ld */'

次に、lsdは目的の結果を生成します。


使ってみませんか?ls -lパス| grep dr
jrobertsz66

5
「その後、lsdは望ましい結果を生成します。」私は笑う
fbafelipe 2017

1
私の経験では、それは結果を生みます。
Todd

私は 'lad'(すべてのディレクトリをリストする)を使用し、 '。* /'も含めて隠しディレクトリも含めました。もちろん、ほのめかしも私には負けません。
DryLabRebel

11

lsディレクトリへのシンボリックリンクを含む実際の解決策

ここでの多くの回答は実際には使用しませんls(またはの簡単な意味でのみ使用しますls -dが、実際のサブディレクトリのマッチングにはワイルドカードをls使用しlsます。並べ替え順序などのオプションを使用できるため、真の解決策は役立ちます。

シンボリックリンクを除く

を使用した1つのソリューションlsが提供されていますが、ディレクトリへのシンボリックリンク除外するという点で他のソリューションとは異なります。

ls -l | grep '^d'

(ファイル名を介して、sedまたはawkファイル名を分離するために)

シンボリックリンクを含む

(おそらくより一般的な)ディレクトリへのシンボリックリンクを含める必要がある-p場合はls、のオプションを使用して、ディレクトリ名(シンボリックリンクを含む)にスラッシュ文字を追加できます。

ls -1p | grep '/$'

または、末尾のスラッシュを取り除く:

ls -1p | grep '/$' | sed 's/\/$//'

ls必要に応じてオプションを追加できます(長いリストが使用されている場合、これ-1は不要です)。

注:私たちがあればしたい最後のスラッシュを、それらがによって強調されたくないgrep、我々はhackishlyラインの実際のマッチした部分が空にすることによって、強調表示を削除することができます。

ls -1p | grep -P '(?=/$)'

9

隠しディレクトリをリストする必要がない場合は、以下を提供します。

ls -l | grep "^d" | awk -F" " '{print $9}'  

また、隠しディレクトリをリストする必要がある場合は、次を使用します。

ls -Al | grep "^d" | awk -F" " '{print $9}'

または

find -maxdepth 1 -type d | awk -F"./" '{print $2}'

awkについて詳しく知りたい場合は、この回答
PHP Learner '29

他の回答と比較して、「ls .. | grep ... | awk」の最初のオプションは過度のスクリプトのようです。
Lars Nordin 2017

1
名前の中に空白を含むディレクトリはないと想定しています。
ベンジャミンR

7

なしでフォルダリストを表示するには /

ls -d */|sed 's|[/]||g'

2
またはls -d1 */ | tr -d "/"
ccpizza 2015

外部コマンドを呼び出す必要はありません:set -- */; printf "%s\n" "${@%/}"

@wholandaの解が好きです。私の少し短い解決策は(テストと動作)です:ls -d * / | sed 's | / || g'
klor

また、lsdirエイリアスがあると便利です。エイリアスlsdirs = "ls -d * / | sed 's | / || g'"
klor

6

これが私が使っているものです

ls -d1 /Directory/Path/*;


これは実際に1行ずつ表示するのに非常に優れたソリューションです。
Nikolay Frick

ディレクトリのみが表示されるわけではありません。末尾にスラッシュを追加する必要があります:ls -d1 /Directory/Path/*/
Skippy le Grand Gourou

6

ディレクトリのみをリストする場合:

ls -l | grep ^d

ファイルのみをリストする場合

ls -l | grep -v ^d 

または、次のようにすることもできます:ls -ld * /


4

アイテムが次のディレクトリであるかどうかをテストしますtest -d

for i in $(ls); do test -d $i && echo $i ; done

1
このコードが何をするか、そしてそれが質問とどのように関連するか説明してください。
Ken YN

1
コマンド 'ls'を実行し、それぞれがディレクトリである場合は出力のテストをループし、ディレクトリである場合はエコーする..動作しますが、より良い方法があります
ShoeLace

3

*/ 現在のディレクトリ内のディレクトリに一致するファイル名一致パターンです。

ディレクトリのみを一覧表示するには、次の関数が好きです。

# long list only directories
llod () { 
  ls -l --color=always "$@" | grep --color=never '^d'
}

.bashrcに入れてください。

使用例:

llod       # long listing of all directories in current directory
llod -tr   # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories

注:この-iオプションを使用すると、破損します。これを修正します:

# long list only directories
llod () { 
  ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}

3

参考までに、すべてのファイルを複数行でls -1印刷する場合は、各ファイルを別々の行に印刷するa を実行できます。file1 file2 file3


3

現在のディレクトリの単純なリストは次のようになります:

ls -1d ./*/

並べ替えてクリーンにしますか?

ls -1d ./*/ | cut -c 3- | rev | cut -c 2- | rev | sort

覚えておいてください:大文字の文字は並べ替えの動作が異なります


3

これを試してみてください。すべてのLinuxディストリビューションで動作します。

ls -ltr | grep drw

4
ls -l | grep '^d' | awk '{print $9}'
dw1 '11 / 11/19

2

「ここ」からのみディレクトリをリストするワンライナー。

ファイル数あり。

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done

2

私は部分的に解決しました:

cd "/path/to/pricipal/folder"

for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done

ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels

まあ、これは私に、市長の部分を減らす:)


2

完全な円にするために追加し、すべてのフォルダのパスを取得するには、アルバートの回答と非常に役立つはずのGordanの組み合わせを使用します。

for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done

出力:

/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/


1

以下は、ディレクトリ名のみを一覧表示するために使用するものです。

ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"

1

元の質問に答えるために、それ自体*/は何の関係もありませんlsグロビングと呼ばれるプロセスで、シェル/バッシュによって行われますます。

これが理由echo */ls -d */、同じ要素を出力します。(-dフラグはls、ディレクトリの内容ではなくディレクトリ名を出力します。)


1

これは、ツリーを使用して、別の行にのみディレクトリ名を出力するバリエーションです。そうです。

tree -d | grep -E '^[├|└]' | cut -d ' ' -f2

またはawkで

tree -d | grep -E '^[├|└]' | awk '{print $2}'

これはおそらくより良い方法であり、/後のディレクトリ名を保持します。

ls -l | grep "^d" | awk '{print $9}'

これは韓国のようです!
Paschalis

0
file *|grep directory

O / P(私のマシン上)-

[root@rhel6 ~]# file *|grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

上記の出力は、cutを使用することでさらに洗練させることができます。

file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir

* could be replaced with any path that's permitted
 file - determine file type
 grep - searches for string named directory
 -d - to specify a field delimiter
 -f1 - denotes field 1

0

ディレクトリのみを一覧表示するための、これまでで最も短いコマンド(実際にはハック)。目的のディレクトリの絶対パスまたは相対パスを入力し、Enterキーを押して目的のディレクトリに入ります。次に、タイプcdしてTabキーを押します。現在、ディレクトリのみが表示されています。

user@ubuntu:~/Desktop$cd <tab key>

上記のコマンドでは、デスクトップのフォルダーのみが表示されます。確かに最短。


これはオートコンプリートが有効になっていることを前提としており、すべてのケースで機能するとは限りません。また、出力を何かにパイプするなど、これで何かをしたい場合、それは機能しません。ただし、出力を表示するだけの場合は、高速かつ簡単に機能することを確認してください。
lacostenycoder

パーフェクト!「。」を削除しました。そして、それはうまくいった
user2060451
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.