特定のディレクトリにあるフォルダの数を数える方法。次のコマンドを使用していますが、常に追加のコマンドが提供されます。
find /directory/ -maxdepth 1 -type d -print| wc -l
たとえば、3つのフォルダーがある場合、このコマンドは4を提供します。5つのフォルダーが含まれる場合、コマンドは6を提供します。なぜですか?
特定のディレクトリにあるフォルダの数を数える方法。次のコマンドを使用していますが、常に追加のコマンドが提供されます。
find /directory/ -maxdepth 1 -type d -print| wc -l
たとえば、3つのフォルダーがある場合、このコマンドは4を提供します。5つのフォルダーが含まれる場合、コマンドは6を提供します。なぜですか?
回答:
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 .vim
PHPでこれをどのように行いますか?または、リストなしで合計のみを取得する方法。つまり、この場合は取得のみ52
ですか?
(ls).Count
ls -l | grep -c ^d
非常にシンプルで機能します。@Pathros PHPにはおそらくより良い方法がありますが、PHPの最悪のケースでは、常にshell_exec()関数を使用してコマンドラインを実行し、結果を文字列に返すことができます。ie $dirCount = shell_exec('ls -l | grep -c ^d');
現在のディレクトリ内のディレクトリのみの数を取得します
echo */ | wc
あなたは次のように出て行きます 1 309 4594
2nd digit
いいえを表します。ディレクトリの。
または
tree -L 1 | tail -1
zsh: no matches found: */
nullglobが必要
echo
。タイプwhich echo
echo */ | wc -w
find . -mindepth 1 -maxdepth 1 -type d | wc -l
「検索」と-mindepth
は、ディレクトリで再帰的な総数を意味します
-maxdepth
ディレクトリ内の総件数を意味します
-type d
ディレクトリを意味します
そしてwc -l
手段のために入力の行を数えます
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"
ドライブにナビゲートして実行する最良の方法
ls -lR | grep ^d | wc -l
そして、サブディレクトリを含む合計ですべてのフォルダを検索するには?
find /mount/point -type d | wc -l
...またはルートディレクトリ(サブディレクトリを含まない)内のすべてのフォルダを検索しますか?
find /mount/point -maxdepth 1 -type d | wc -l
乾杯!
-lR
は、find -type d
それらをカウントする間、ドットプレフィックス付きディレクトリを無視することに注意してください。したがって、ドットプレフィックス付きディレクトリがある場合(たとえば、.gitサブディレクトリがある場合)、最初のコマンドによって与えられるカウントは間違っています。-lRa
各ディレクトリa .
と..
エントリも取得するため、単純に使用することはできません 。これは、@ Pavel Anossovの回答にも適用されます
実行stat -c %h folder
し、結果から2を引きます。これは、他のほとんどのソリューションで必要な2(または3)とは対照的に、単一のサブプロセスのみを使用します(通常はfind
plus 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を引く必要があります。
いくつかの便利な例:
現在のディレクトリ内のファイルを数える
/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
以下のコマンドを使用して見つけることができるディレクトリはありません
ls -l | grep "^d" | wc -l
ls -l | grep ^d | wc -l
やるだろう、使用する必要はありません"
ここに
純粋な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
文字数をカウントすることです。これは、リンクを除くすべてのディレクトリ(非表示のものを含む)の数をカウントします。
ここで紹介する方法はすべて、ファイル名に含まれるおかしな文字(スペース、改行、グロブ文字など)に対して安全です。
使用zsh
:
a=(*(/N)); echo ${#a}
N
nullglobで、/
それはディレクトリ、一致します#
カウントを。それはディレクトリ名のスペースにきちんと対処し、ディレクトリ0
がない場合に戻ります。
正規表現を使用したい場合は、以下を試してください。
ls -c | grep "^d" | wc -l
あなたが望むものへの最良の答えは
echo `find . -maxdepth 1 -type d | wc -l`-1 | bc
これは1を引いて、不要な「。」を削除します。リストを見つけるディレクトリ(上記のpatel devenと同様)。
サブフォルダーを再帰的にカウントする場合は、maxdepthオプションを省略してください。
echo `find . -type d | wc -l`-1 | bc
PSコマンドの置換が見苦しい場合は、sed
and を使用して、置換を純粋なストリームとして実行できます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
それを行うための最良の方法:
ls -la | grep -v total | wc -l
これはあなたに完璧な数を与えます。
total
か?あなたの方法は壊れてい:(
ます。解析しないでくださいls
!