web-dev-qa-db-ja.com

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

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

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

そしてそのパスのディレクトリだけをリストするためにどうやって上記のコマンド(例えばls -d /home/alice/Documents)で絶対パスを与えることができますか?

791
Sibi

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

843
Gordon Davisson

これを実現するための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. lsgrepを使う

例: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/
423
Albert

私が使う:

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

これは末尾にスラッシュを付けずに単一の列を作成します - スクリプトに便利です。

私の二セント。

80

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

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

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

find /home/alice/Documents -type d
46
at3m

4(もっと)信頼できるオプション。

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

1.-エコー.

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

シェルによって、PWD内のすべてのディレクトリをechoに展開します。


これをテストするには、次のようにします。test-dirのような名前のディレクトリ(mkdir)を作成し、その中に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のディレクトリのリストを取得する理由です。 lsへの-dオプションは、(デフォルトで提示されるように)各ディレクトリの内容の代わりに現在のディレクトリエントリを一覧表示させます。

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

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

32
user2350426

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 tree でもっと多くの引数を見ることができます

16
Hamish Downer

'ls -d * /'からの出力が two の末尾のスラッシュを表示するのはなぜだろうと思っているのであれば、

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

おそらく、シェルまたはセッションの設定ファイルのどこかで、lsコマンドが-Fフラグを含むバージョンのlsにエイリアスされているためです。そのフラグはそれぞれの出力名(それは普通のファイルではありません)にそれが何かの種類を示す文字を追加します。したがって、片方のスラッシュはパターン '* /'に一致するfromで、もう片方のスラッシュは追加タイプ標識です。

この問題を解決するために、もちろんlsに別のエイリアスを定義することができます。ただし、一時的にエイリアスを呼び出さないようにするには、コマンドの前に円記号を付けます。

\ ls -d * /

11
gwideman

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

alias lsd='ls -ld */'

その場合、lsdは望みの結果を生成します。

9

実際のlsソリューション(ディレクトリへのシンボリックリンクを含む)

ここでの多くの答えは、実際にはlsを使用しません(または、実際のサブディレクトリの一致にワイルドカードを使用しながら、ls -dの些細な意味でのみ使用します。真のlsソリューションは有用ですソート順などにlsオプションを使用できます。

シンボリックリンクを除外する

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

ls -l | grep '^d'

(ファイル名を分離するために、おそらくsedまたはawkをパイプ処理します)

シンボリックリンクを含める

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

ls -1p | grep '/$'

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

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

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

注:スラッシュwant末尾のスラッシュがgrepで強調表示されたくない場合、実際に一致する部分を作成することにより、強調表示をハックして削除できます。空行:

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

隠されたディレクトリがリストされる必要がないならば、私は提供します:

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

隠しディレクトリを一覧表示する必要がある場合は、次のようにします。

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

OR

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

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

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

ディレクトリ :のみを一覧表示します。

ls -l | grep ^d

ファイル :のみを一覧表示する

ls -l | grep -v ^d 

あるいは、次のようにすることもできます。

6
Vijay Gawas

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

ls -d1 /Directory/Path/*;

5
Banning

アイテムがtest -dを持つディレクトリかどうかをテストします。

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

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

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

# 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'
}
2
Robin A. Meade

参考までに、すべてのファイルを複数行で印刷したい場合は、各ファイルを別々の行に印刷するls -1を実行できます。 ファイル1 ]ファイル2 ]ファイル3

2
warfreak92

"here"からのみディレクトリを一覧表示するワンライナー。

ファイル数あり。

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

Perlを使う:

ls | Perl -nle 'print if -d;'

これを試してください。これはすべてのディストリビューションで機能します。 grep drw

1
Raj RD

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

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

まあ、これは私に還元します、市長部分:)

1
inukaze

元の質問に答えるために、*/lsそれ自体とは何の関係もありません。それは globbing として知られるプロセスで、Shell/Bashによって行われます。

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

1
flow2k

一周するために追加し、すべてのフォルダのパスを取得するには、Albertの回答とGordansの組み合わせを使用します。

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
BilliAm

現在のディレクトリの単純なリストです。

ls -1d ./*/

あなたはそれを分類してきれいにしたいですか?

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

これが私がディレクトリ名だけをリストするのに使っているものです:

ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
0
Robert Lujo
file *|grep directory

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

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

上記の出力は、カットを使用してさらに洗練することができます。

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
AVS

これは、別の行にのみディレクトリ名を出力するツリーを使用したバリエーションです。はい、それはbutいですが、ちょっと、それは動作します。

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

またはawkを使用

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

ただし、これはおそらくより優れており、ディレクトリ名の後に/を保持します。

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