使用shell脚本计算文件和目录

我正在学习bash脚本,并且编写了一个脚本来计算作为参数提供的目录中的文件和目录。 我的工作方式对我来说似乎很奇怪,我想知道是否有一个更简单的方法来做到这一点。

我已经注释了可以工作的代码,但将其作为比较。 我试图让for -loop工作,而不是使用if语句来检测给定位置的项目是文件还是目录。

编辑 :我刚刚发现,评论的代码计数在给定的位置的子目录中的所有文件和目录! 有没有什么办法来防止这种情况,只计算给定位置的文件和目录?

 #!/bin/bash LOCATION=$1 FILECOUNT=0 DIRCOUNT=0 if [ "$#" -lt "1" ] then echo "Usage: ./test2.sh <directory>" exit 0 fi #DIRS=$(find $LOCATION -type d) #FILES=$(find $LOCATION -type f) #for d in $DIRS #do # DIRCOUNT=$[$DIRCOUNT+1] #done #for f in $FILES #do # FILECOUNT=$[$FILECOUNT+1] #done for item in $LOCATION do if [ -f "$item" ] then FILECOUNT=$[$FILECOUNT+1] elif [ -d "$item" ] then DIRCOUNT=$[$DIRCOUNT+1] fi done echo "File count: " $FILECOUNT echo "Directory count: " $DIRCOUNT 

出于某种原因, for -loop的输出,无论我指向哪个位置,总是返回:

 File count: 0 , Directory count: 1 

你不是迭代给定目录内的文件列表; 在$LOCATION之后添加/* 。 你的脚本应该是这样的:

 ... for item in $LOCATION/* do ... 

正如dogbane所指出的那样,仅仅添加/*将只计算不以开始的文件. ; 为此,您应该做以下事情:

 ... for item in $LOCATION/* $LOCATION/.* do ... 

使用find如下所示。 此解决方案将正确计数文件名与空格,换行符和点文件。

 FILECOUNT="$(find . -type f -maxdepth 1 -printf x | wc -c)" DIRCOUNT="$(find . -type d -maxdepth 1 -printf x | wc -c)" 

请注意, DIRCOUNT包含当前目录( . )。 如果你不想要这个,减1。

 ((DIRCOUNT--)) # to exclude the current directory 

要解决您可以使用的问题:

 FILECOUNT=$(find $LOCATION -type f | wc -l) DIRCOUNT=$(find $LOCATION -type d | wc -l) 

find将在$LOCATION下递归地查找所有文件( -type f )或目录( -type dwc -l会计算每种情况下写入stdout的行数。

但是,如果你想学习,bash脚本可能是一个更好的方法。 一些评论:

  • 如果只想在$LOCATION查找文件/目录(不是递归地在其子目录下),则可以使用for item in $LOCATION/* ,其中*将展开到$LOCATION目录中的文件/目录列表。 缺少的*是为什么你的原始脚本返回0/1(因为$LOCATION目录本身是唯一的项目计数)。
  • 您可能首先要检查$LOCATION实际上是一个带有[ -d $LOCATION ]的目录。
  • 对于算术表达式,使用$(( ... )) ,例如FILECOUNT=$(( FILECOUNT + 1 ))
  • 如果你想递归查找所有的文件/目录,你可以把find和循环结合起来。

例:

 find $LOCATION | while read item; do # use $item here... done 

... am wondering if there is a simpler way of doing it.

如果你这样说;)

或者,减少你的脚本

 find /path/to/directory | wc -l 

对于当前目录,执行:

 find . | wc -l 

使用

 find $LOCATION -maxdepth 1 -type f | wc -l 

对于文件的计数,和

 find $LOCATION -maxdepth 1 -type d | wc -l 

用于计算目录