假设我位于桌面目录中,想要计算名称为 的文件和目录的数量exam
。它还应该计算包含字符串的文件exam
。所以总结一下我需要:
- 计算具有名称的目录
exam
- 统计文件的名称和内容
exam
这是我到目前为止所尝试过的。
ls -l | grep -r "exam" | wc -l
但此命令仅对具有 content 的文件进行计数exam
。如果我有几个目录:exam1
、exam2
、exam3
和几个 .txt 文件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
,如果是,则脚本将计数器加一。
编辑:我可能误解了你的问题,你想分别计算目录和文件。在这种情况下,将脚本修改为
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"