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

时间:2012-12-05 15:49:09

标签: linux bash shell unix scripting

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

我已经注释掉了可行的代码,但将其作为比较。我试图让for - 循环工作,而不是在其中使用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 - 循环的输出,无论我指向何处,都会返回:

File count: 0 , Directory count: 1

5 个答案:

答案 0 :(得分:14)

使用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

答案 1 :(得分:11)

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

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

find会在-type f下递归查找所有文件(-type d)或目录($LOCATION); wc -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

答案 2 :(得分:5)

您没有迭代给定目录中的文件列表;在/*之后添加$LOCATION。您的脚本应如下所示:

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

正如dogbane指出的那样,只需添加/*即可只计算不以.开头的文件;为此,您应该执行以下操作:

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

答案 3 :(得分:2)

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

如果你这样说;)

或者,将脚本缩小为

find /path/to/directory | wc -l

对于当前目录,请执行:

find . | wc -l

答案 4 :(得分:2)

使用

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

对于文件计数和

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

用于计算目录