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

counting files, directories and subdirectories in a given path

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

count.sh /home/users/documents/myScripts

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

例如:

  1. 7
  2. 8
  3. 9
  4. 10

(myScripts - 7,文档 - 8,用户 -9,主页 - 10)

顺便问一下,我可以 运行 这个脚本使用 count.sh pwd 吗?

您可以尝试以下方法

#!/bin/bash

DIR=$(cd "" ; pwd)
PREFIX=
until [ "$DIR" = / ] ; do 
    echo -n "$PREFIX"$(basename "$DIR")" "$(ls -Ab "$DIR" | wc -l)
    DIR=$(dirname "$DIR")
    PREFIX=", "
done
echo

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

您可以使用

调用脚本
count.sh `pwd`

大致是这样的:

#!/bin/sh

P=""

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`

从当前目录使用它

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

#!/bin/bash

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

p=""  ## 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