统计包含特定字符串的文件和文件夹的数量

统计包含特定字符串的文件和文件夹的数量

假设我位于桌面目录中,想要计算名称为 的文件和目录的数量exam。它还应该计算包含字符串的文件exam。所以总结一下我需要:

  1. 计算具有名称的目录exam
  2. 统计文件的名称和内容exam

这是我到目前为止所尝试过的。

ls -l | grep -r "exam" | wc -l 

但此命令仅对具有 content 的文件进行计数exam。如果我有几个目录:exam1exam2exam3和几个 .txt 文件exam1.txtexam2.txtexam3.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输出该字符串。否则,如果该事物是非目录,并且其内容包含单词 examfile,然后输出字符串。最后的sort和 将对uniq -c找到的符合条件的文件和目录进行排序和计数。

请注意,对名称的测试可能会匹配包含exam子字符串的名称,例如examplegrep文件上使用的将使-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"

相关内容