特定のディレクトリ内のディレクトリの数を数える


103

特定のディレクトリにあるフォルダの数を数える方法。次のコマンドを使用していますが、常に追加のコマンドが提供されます。

find /directory/ -maxdepth 1 -type d -print| wc -l

たとえば、3つのフォルダーがある場合、このコマンドは4を提供します。5つのフォルダーが含まれる場合、コマンドは6を提供します。なぜですか?


4
追加の1カウントは、現在のディレクトリ「。」が原因です。、これも「検索」によって考慮されます。
patel deven

回答:


94

find ディレクトリ自体も出力しています:

$ find .vim/ -maxdepth 1 -type d
.vim/
.vim/indent
.vim/colors
.vim/doc
.vim/after
.vim/autoload
.vim/compiler
.vim/plugin
.vim/syntax
.vim/ftplugin
.vim/bundle
.vim/ftdetect

代わりに、ディレクトリの子をテストし、子孫にはまったく移動しないでください。

$ find .vim/* -maxdepth 0 -type d
.vim/after
.vim/autoload
.vim/bundle
.vim/colors
.vim/compiler
.vim/doc
.vim/ftdetect
.vim/ftplugin
.vim/indent
.vim/plugin
.vim/syntax

$ find .vim/* -maxdepth 0 -type d | wc -l
11
$ find .vim/ -maxdepth 1 -type d | wc -l
12

あなたも使うことができますls

$ ls -l .vim | grep -c ^d
11


$ ls -l .vim
total 52
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
-rw-rw-r--  1 anossovp anossovp   48 Aug 29  2012 filetype.vim
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
-rw-rw-r--  1 anossovp anossovp 2505 Aug 29  2012 README.rst
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

$ ls -l .vim | grep ^d
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

いいね!$ ls -l .vimPHPでこれをどのように行いますか?または、リストなしで合計のみを取得する方法。つまり、この場合は取得のみ52ですか?
Pathros 2017年

ああ。PowerShellに対する主張がBASHの方がすべての点で簡単であるという点が気に入っています。これを行うためのPOSHコマンドを見たいですか?(ls).Count
Kolobキャニオン2017

@Pathros グロブをフラグGLOB_ONLYDIRとともに使用し、結果をcount()します。
Pilipe

1
ls -l | grep -c ^d非常にシンプルで機能します。@Pathros PHPにはおそらくより良い方法がありますが、PHPの最悪のケースでは、常にshell_exec()関数を使用してコマンドラインを実行し、結果を文字列に返すことができます。ie $dirCount = shell_exec('ls -l | grep -c ^d');
ギガバイト

66

現在のディレクトリ内のディレクトリのみの数を取得します

echo */ | wc

あなたは次のように出て行きます 1 309 4594

2nd digitいいえを表します。ディレクトリの。

または

tree -L 1 | tail -1


8
残念ながら、dir名にスペースがある場合、これは失敗します。
マイケルキャンベル

zsh: no matches found: */nullglobが必要
Anne van Rossum

@AnnevanRossumドゥあなたが持っていますecho。タイプwhich echo
EmptyData

7
最初のものは少し改善することができます:echo */ | wc -w
ibic

注意代わりに0のないディレクトリが存在しない場合、これは1をカウントすること
jinawee

27
find . -mindepth 1 -maxdepth 1 -type d | wc -l

「検索」と-mindepthは、ディレクトリで再帰的な総数を意味します

-maxdepth ディレクトリ内の総件数を意味します

-type d ディレクトリを意味します

そしてwc -l手段のために入力の行を数えます


2
あなたの答えを説明してください(あなたの答えの中に)?
ズールー

-mindepthはディレクトリ内の総件数を意味し、-maxdepthはディレクトリ内の総件数を意味し、-type dはディレクトリを意味し、wc -lは指定されたディレクトリリストからの行数を意味します
shiyani suresh

find . -mindepth 1 -maxdepth 1 -type d | wc -lたとえば、次のように、数字の間に多くのスペースを与えます: `2`これを使用してそれを防ぐこと dir_count=`find . -maxdepth 1 -type d | wc -l | xargs`; echo $dir_count # will print just 2 ができます:次のような条件に役立ちます:if (( $dir_count > 1 )); then echo "Yaa"; fi # will print "Yaa"
naorz

16

フォルダにディレクトリしかなく、ファイルがない場合は、次のようになります。

ls | wc -l

2
これはファイルも取得しますが、問題はフォルダ/ディレクトリに関するものでした。
ロバート

12

ドライブにナビゲートして実行する最良の方法

ls -lR | grep ^d | wc -l

そして、サブディレクトリを含む合計ですべてのフォルダを検索するには?

find /mount/point -type d | wc -l

...またはルートディレクトリ(サブディレクトリを含まない)内のすべてのフォルダを検索しますか?

find /mount/point -maxdepth 1 -type d | wc -l

乾杯!


前のls -lRは、find -type d それらをカウントする間、ドットプレフィックス付きディレクトリを無視することに注意してください。したがって、ドットプレフィックス付きディレクトリがある場合(たとえば、.gitサブディレクトリがある場合)、最初のコマンドによって与えられるカウントは間違っています。-lRa各ディレクトリa ...エントリも取得するため、単純に使用することはできません 。これは、@ Pavel Anossovの回答にも適用されます
marcz

12

実行stat -c %h folderし、結果から2を引きます。これは、他のほとんどのソリューションで必要な2(または3)とは対照的に、単一のサブプロセスのみを使用します(通常はfindplus wc)。

sh / bashの使用:

cnt = $(( `stat -c%h folder`-2))
echo $ cnt# 'echo'はsh / bash組み込みであり、追加のプロセスではありません

csh / tcshの使用:

@ cnt = `stat -c%h folder`-2
echo $ cnt# 'echo'はcsh / tcsh組み込みであり、追加のプロセスではありません


説明:folderstat -c %h folderへのハードリンクの数を出力し、folderの下の各サブフォルダーには、folderへのハードリンクである../エントリーが含まれています。カウントには2つの追加ハードリンクがあるため、2を引く必要があります。

  1. フォルダ自身の自己参照./エントリ、および
  2. フォルダーへのフォルダーの親のリンク

この質問に関連して:[新しいディレクトリに何かが追加される前に、ハードリンクのカウントが2になるのはなぜですか?](unix.stackexchange.com/questions/101515)これが優れた回答である理由を説明しています。残念ながら、これは十分な注意を受けませんでした!これは良い答えですが、残念ながらファイルシステムに依存しますが、ほとんどの一般的なファイルシステムではこれでうまくいきます。
kvantour

8

最も簡単だと思います

  ls -ld images/* | wc -l

imagesターゲットディレクトリはどこですか。-dフラグはディレクトリに制限し、-lフラグは行ごとのリストを実行しwc -lます。これは、よく知られている行数と互換性があります。


また、結果+1
josef

1
によるとman ls-d「内容ではなくディレクトリ自体を一覧表示する」、つまり、を実行すると、の内容ls /tmpが取得され/tmp、実行ls -d /tmpすると、だけが取得され/tmpます。-d以下のために頼まれたように、スイッチは、ディレクトリをフィルタしません。
ロバート

5

いくつかの便利な例:

現在のディレクトリ内のファイルを数える

/bin/ls -lA  | egrep -c '^-'

現在のディレクトリのディレクトリをカウントする

/bin/ls -lA  | egrep -c '^d'

現在のディレクトリ内のファイルとディレクトリをカウントする

/bin/ls -lA  | egrep -c '^-|^d'

1つのサブディレクトリ内のファイルとディレクトリをカウントする

/bin/ls -lA  subdir_name/ | egrep -c '^-|^d'

私は奇妙なことに気づきました(少なくとも私の場合):

私がls代わりに試してみたとき/bin/ls-Aパラメータdo not list implied . and ..は期待どおりに機能しません。lsそのショー./と../ を使用すると 、誤ったカウントが発生します。解決策:/bin/ls代わりにls


4

以下のコマンドを使用して見つけることができるディレクトリはありません

ls -l | grep "^d" | wc -l


ただ、ls -l | grep ^d | wc -lやるだろう、使用する必要はありません"ここに
kaspiotr

3

純粋なbashソリューション:

shopt -s nullglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} (non-hidden) directories"

隠しディレクトリも数えたい場合:

shopt -s nullglob dotglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} directories (including hidden ones)"

これはディレクトリへのリンクもカウントすることに注意してください。それを望まない場合は、この方法では少し難しくなります。


使用find

find /path/to/directory -type d \! -name . -prune -exec printf x \; | wc -c

トリックはx、ディレクトリが見つかるたびにstdout に出力し、それからwc文字数をカウントすることです。これは、リンクを除くすべてのディレクトリ(非表示のものを含む)の数をカウントします。


ここで紹介する方法はすべて、ファイル名に含まれるおかしな文字(スペース、改行、グロブ文字など)に対して安全です。


これはこの質問で提示された最良の解決策であり、常に機能します!
kvantour

3

使用zsh

a=(*(/N)); echo ${#a}

Nnullglobで、/それはディレクトリ、一致します#カウントを。それはディレクトリ名のスペースにきちんと対処し、ディレクトリ0がない場合に戻ります。


0

すべてのファイルとサブフォルダーをカウントし、Windowsスタイル:

dir=/YOUR/PATH;f=$(find $dir -type f | wc -l); d=$(find $dir -mindepth 1 -type d | wc -l); echo "$f Files, $d Folders"

0

正規表現を使用したい場合は、以下を試してください。

ls -c | grep "^d" | wc -l

1
コードのみの回答に説明を追加しますか?StackOverflowは無料のコード作成サービスであるという誤解と戦うのに役立ちます。また、外観を改善するには、こちらをご覧ください:stackoverflow.com/editing-help
Yunnosch

0

あなたが望むものへの最良の答えは

echo `find . -maxdepth 1 -type d | wc -l`-1 | bc

これは1を引いて、不要な「。」を削除します。リストを見つけるディレクトリ(上記のpatel devenと同様)。

サブフォルダーを再帰的にカウントする場合は、maxdepthオプションを省略してください。

echo `find . -type d | wc -l`-1 | bc

PSコマンドの置換が見苦しい場合は、sedand を使用して、置換を純粋なストリームとして実行できますbc

カウントから1を引く:

find . -maxdepth 1 -type d | wc -l | sed 's/$/-1\n/' | bc

または、マイナス1にカウントを追加します。

find . -maxdepth 1 -type d | wc -l | sed 's/^/-1+/' | bc

-1

それを行うための最良の方法:

ls -la | grep -v total | wc -l

これはあなたに完璧な数を与えます。


6
あなたはそれがそれを行うためのより悪い方法だということです!さらに、これはディレクトリの数を数えませんそして、文字列を含むディレクトリ名がある場合はどうなりますtotalか?あなたの方法は壊れてい:(ます。解析しないでくださいls
gniourf_gniourf 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.