计算目录中的文件

时间:2014-07-22 17:38:42

标签: bash find sh

出于某种原因,我似乎在这里遇到了一些格式问题。我试图计算jvm目录中的文件数。我计算与已知整数进行比较(即文件应包含51个文件)。目的是确保所有文件都存在。基本上,这是一种快速而肮脏的方式,可以查看下载后是否存在所有文件,并将un-tar作为安装程序的一部分。最初我打算使用MD5(在某些方面它更理想,因为它会检查文件损坏),但它需要太长时间,我不能采用目录的MD5,所以我要么重新调整相关目录在计算或计算每个文件之前,这些文件过于繁琐。我不能使用差异,因为没有相同的目录可以比较。它所做的就是在开始安装之前检查所有必需的文件是否存在。如果有人可以推荐不同的策略,我会张扬耳朵。如果没有,这个简单的解决方案将有效,如果我让它正常工作。以下是我所做的一切:

首先找到jvm文件夹中的文件数(因为我们提供了jvm容器,所以总是应该是51)

COUNT=$(find jvm -type f | wc -l)
if [ "$COUNT" = "51" ]; then
  YAY
else
  OOPS
fi

出于某种原因,我认为第一个命令的输出包含空格,因此将所有输出都存储为字符串。比较发生时,它会失败。

此脚本必须同时在bash和sh

中运行

3 个答案:

答案 0 :(得分:1)

要正确计算Unix系统上的文件,请使用以下脚本:

c=0
while read -d '' line; do
    ((c++))
done < <(find jvm -maxdepth 1 -type f -print0)

echo $c

此脚本将使用空格或新行来处理文件名。

答案 1 :(得分:0)

你正在进行字符串比较:

if [ "$COUNT" = "51" ]

由于$count是一个数字,请使用-eq进行数字比较:

if [[ $COUNT -eq 51 ]]

这样,$COUNT前面的空白区域不会影响比较。也不是双方括号。现在,这比单个方括号更受欢迎。当你忘记引号时,它不容易出错。

答案 2 :(得分:0)

你也可以使用简单的:

count=`find jvm -maxdepth 1 -type f -print0 | grep -zc '.'`
  • 找到
    • 搜索files目录中的所有jvm
    • 并将其打印为null terminated字符串。
  • grep
    • -z说grep接受null terminated字符串作为输入(每个字符串是一个&#34;行&#34;)
    • -c计算匹配的&#34;行&#34;
    • 匹配任何字符.
  • 反对标记为bashsh兼容
  • 该脚本不受文件名中任何特殊字符的影响(例如,也可以包含\n

使用此功能,您还可以filter&count文件名,例如

count=`find jvm -maxdepth 1 -type f -print0 | grep -zc '\.java'`

计算以.java结尾的文件等。