完全なディレクトリサブツリーから名前が "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
最後にその変数を印刷します。