ディレクトリ数の計算

ディレクトリ数の計算

完全なディレクトリサブツリーから名前が "lib"で始まる複数のディレクトリを印刷するには、スクリプトまたはコマンドが必要です。これを行うためにfind、grep、wcを使用しようとしましたが、すべてのディレクトリを検索することはできませんでした。どうすればいいですか?

答え1

find . -type d -name lib\* -exec echo x \; | wc -l

答え2

LC_ALL=C find .//. -name 'lib*' -type d | grep -c //

find . | wc -l改行を含むファイルパスがあると正しく機能しないため、使用できません。

そうしないとLC_ALL=C、次から始まりますが、lib名前の残りの部分に有効な文字を形成しないバイトを含むディレクトリ名は評価されない可能性があります。

そしてzsh

(){echo $#} **/lib*(DN/)

答え3

すべてのlibディレクトリに共通名があり、改行やその他の奇妙でエキゾチックな文字がないとします。

find / -type d -name "lib*" -print | wc -l

これは、「フルディレクトリサブツリー」が「どこでも」を意味すると仮定する。現在のディレクトリまたは次のディレクトリのみを計算/するように変更します。.

このfindコマンドは、名前が()で始まるすべてのディレクトリ()を見つけて-type d印刷します()。lib-name "lib*"-print

計算されるwc -l出力の行数ですfind

答え4

globstar以下は、シェルオプションを使用するbash専用のソリューションです。

$ shopt -s globstar; c=0; for f in ** ; do echo "${f##*/}"; [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]  && ((c++)); done ; echo $c

または、より読みやすくするためにスクリプト形式で使用します。

#!/usr/bin/env bash
shopt -s globstar 
c=0
for f in **
do 
    echo "${f##*/}"
    if [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]
    then 
        ((c++))
    done
echo $c

globstar再帰ワイルドカードを有効にし、これがパターン一致とフラグを介してディレクトリであること[[-d確認できるように、カウンタ変数をインクリメントし、$c最後にその変数を印刷します。

関連情報