计算给定路径中的文件,目录和子目录

时间:2016-02-06 08:38:44

标签: bash shell directory pathname

我想知道如何运行一个简单的脚本" count.sh"与路径一起调用,例如:

count.sh /home/users/documents/myScripts

脚本需要遍历此路径中的目录,并在此路径的每个级别中打印多少个文件和文件夹(包括隐藏)。

例如:

  1. 7
  2. 8
  3. 9
  4. 10
  5. (myScripts - 7,documents - 8,users -9,home - 10)

    顺便说一句,我可以使用count.sh pwd运行此脚本吗?

3 个答案:

答案 0 :(得分:0)

您可以尝试以下

ls -Ab

.列出除..wc -l以外的所有文件和文件夹,并转义特殊字符,这样即使文件名包含换行符,每个文件也只打印一行。{{1}计算行数。)

您可以使用

调用脚本
count.sh `pwd`

答案 1 :(得分:0)

或多或少的那样:

#!/bin/sh

P="$1"

while [ "/" != "$P" ]; do
    echo "$P `find \"$P\" -maxdepth 1 -type f | wc -l`"
    P=`dirname "$P"`;
done
echo "$P `find \"$P\" -maxdepth 1 -type f | wc -l`"

您可以使用script.sh `pwd`

在当前目录中使用它

答案 2 :(得分:0)

另一种方法是使用数组处理分离或标记路径,并使用内部字段分隔符IFS)控制分词。如果需要,您可以包含根目录(在这种情况下,您需要修剪打印输出中的其他前导'/')

#!/bin/bash

[ -z "$1" -o ! -d "$1" ] && {
    printf "error: directory argument required.\n"
    exit 1
}

p="$1"  ## remove two lines to include /
[ "${p:0:1}" = "/" ] && p="${p:1}" 

oifs="$IFS"     ## save internal field separator value
IFS=$'/'        ## set to break on '/'
array=( $p )    ## tokenize given path into array
IFS="$oifs"     ## restore original IFS

## print out path level info using wc
for ((i=0; i<${#array[@]}; i++)); do
    dirnm="${dirnm}/${array[i]}"
    printf "%d. %s -- %d\n" "$((i+1))" "$dirnm" $(($(ls -Al "$dirnm" | wc -l)-1))
done

示例输出

$ bash filedircount.sh /home/david/tmp
1. /home -- 5
2. /home/david -- 132
3. /home/david/tmp -- 113

作为替代方案,您可以使用for循环遍历并计算每个级别的目录中的项目,而不是根据需要使用wc