【问题标题】:counting files, directories and subdirectories in a given path计算给定路径中的文件、目录和子目录
【发布时间】:2016-05-16 07:25:42
【问题描述】:

我试图弄清楚如何运行一个简单的脚本“count.sh”,它与路径一起调用,例如:

count.sh /home/users/documents/myScripts

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

例如:

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

(myScripts - 7,文档 - 8,用户 -9,家庭 - 10)

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

【问题讨论】:

  • "打印该路径的每一层有多少文件和文件夹(包括隐藏的)" -- 你只是在寻找path-component 还是深度?或者你是说/home/中有7文件,/home/users中有8/home/users/documents中有9等等。写的很模糊。
  • 没有注意到,感谢您的询问。我的意思是此路径的每个“级别”中的每个文件夹中有多少个文件和子文件夹。比如 home 有 7 个文件和文件夹,/users/ 有 8 个文件和文件夹等等。

标签: bash shell directory pathname


【解决方案1】:

或多或少是这样的:

#!/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】:

另一种方法是使用数组处理分隔或标记路径,并使用 内部字段分隔符 (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

【讨论】:

    【解决方案3】:

    你可以试试下面的

    #!/bin/bash
    
    DIR=$(cd "$1" ; 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`
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2015-06-28
    • 2013-06-13
    • 2020-12-30
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多