私がデスクトップディレクトリにあり、名前が..のファイルとディレクトリの数を数えたいとしましょうexam
。また、文字列を含むファイルも計算する必要がありますexam
。要約すると、以下が必要です。
- 名前によるディレクトリ数の計算
exam
- 統計ファイル名と内容
exam
これまで私が試したことは次のとおりです。
ls -l | grep -r "exam" | wc -l
ただし、このコマンドは内容のあるファイルのみを計算しますexam
。複数のディレクトリ(、exam1
および複数の.txtファイル、、、)があり、それらを数えたい場合はどうすればよいですか?exam2
exam3
exam1.txt
exam2.txt
exam3.txt
答え1
find
ディレクトリとディレクトリ以外の項目を異なる方法で処理するには、を使用してディレクトリとディレクトリ以外の項目の数をそれぞれ取得します。
find . -name '*exam*' \
\( \( -type d -exec echo directory \; \) -o \
\( ! -type d -exec grep -q -wF exam {} \; -exec echo file \; \) \) |
sort | uniq -c
名前に文字列を含む現在のディレクトリまたはその下のコンテンツを探しますexam
。モノがディレクトリの場合、directory
この文字列が出力されます。そうでない場合、そのものがディレクトリではなく、その内容に次のものが含まれている場合言葉 exam
file
を押してから文字列を出力します。最終sort
合計は、uniq -c
基準に一致するファイルとディレクトリをソートして計算します。
名前テストは、部分exam
文字列を含む名前と一致させることができますexample
。grep
ファイルを使用すると、-w
その可能性が高くなります。言葉部分文字列ではなく一致です。
答え2
私は次の2つのコマンドでそれをしました。
ディレクトリ数の計算
find path -type d -iname "exam[0-9]" | wc -l
条件付きファイル数を数えるには、ファイルの内容を確認する必要があります。
find path -type f -iname "exam[0-9]" -exec grep 'exam' {} \;|wc -l
答え3
この試み、
フォルダの場合:
ls -lR * | awk -F '[ /]' ' !/^-/ && !/^d/{if ($NF ~ "exam" ) print $NF}' | wc -l
ファイルの場合:
ls -lR * | awk '/^-/ {if ($NF ~ "exam" ) print $NF}' | wc -l
答え4
次のスクリプトは必要なものを達成します。
i=0
for file in *exam*
do
if [ -d "$file" ] || [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]
then
i=$((i+1))
fi
done
echo "Number of files: $i"
名前にが含まれているすべてのファイルを繰り返し、exam
各ファイルのディレクトリか文字列が含まれていることを確認しますexam
。その場合、スクリプトはカウンタを1ずつ増やします。
編集する:ご質問を誤解している可能性があります。ディレクトリとファイルを別々に計算したいです。その場合は、スクリプトを次のように修正してください。
i=0;j=0
for file in *exam*
do
if [ -d "$file" ]; then
i=$((i+1))
elif [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]; then
j=$((j+1))
fi
done
echo "Number of directories: $i"
echo "Number of regular files: $j"