计算指定目录中的所有文件/目录-bash/shell脚本

计算指定目录中的所有文件/目录-bash/shell脚本,bash,shell,unix,scripting,Bash,Shell,Unix,Scripting,成品意味着递归地计算指定目录中的所有内容,如果没有输入参数,则计算当前目录。现在我只是想让它计算指定目录中的任何内容。我很难让最后的陈述算数。 它将回显目录中的0个文件 谁能给我一些提示吗?我还是一个初学者,所以对我放松点,谢谢 #!/bin/bash #A shell script program that counts recursively how many directories/files exist in a given directory. declare -i COUNT=0

成品意味着递归地计算指定目录中的所有内容,如果没有输入参数,则计算当前目录。现在我只是想让它计算指定目录中的任何内容。我很难让最后的陈述算数。 它将回显目录中的0个文件

谁能给我一些提示吗?我还是一个初学者,所以对我放松点,谢谢

#!/bin/bash
#A shell script program that counts recursively how many directories/files exist in a given directory.

declare -i COUNT=0
declare -i COUNT2=0
#The script will treat COUNT as an integer that is 0 until modified.
if [ "$#" -eq "0" ]
    then

        for i in *
        do
            ((COUNT++))
        done
    ((COUNT--)) #This is done because there is always an overcount of 1.
    echo "There are $COUNT files and/or directories in the current directory here."
fi

if [[ -d $1 ]]
    then
        for i in $1
        do
            ((COUNT++))
        done
    ((COUNT--)) #This is done because there is always an overcount of 1.
    echo "There are $COUNT files and/or directories in $1."
fi

if [[ -d $2 ]]
    then
        for i in $2
        do
            ((COUNT2++))
        done
    ((COUNT2--)) #This is done because there is always an overcount of 1.
    echo "There are $COUNT2 files and/or directories in $2."
fi
exit 0

首先,你可以用一行纸做你想做的事:

find . | wc -l  
查找。
表示“在当前目录和所有子目录中搜索”。由于没有其他参数,它将简单地列出所有内容。然后,我使用一个管道和
wc
,它代表“字数”。
-l
选项表示“仅输出行数”

现在,对于您的代码,这里有一些提示。首先,我真的不明白为什么要重复代码三次(0美元、1美元和2美元)。你可以简单地做:

dir="$1"
if [ -z "$dir" ]; then dir="."; fi
将命令行参数的值存储在$dir中,如果未提供任何值,(-z表示“为空”),则为dir指定一个默认值

如果
$1
是目录的路径,则$1中的i的
将不起作用。因此,您可以使用

以美元表示的i(ls$dir)


此外,在代码中,您不会递归计数。这是自愿的还是你不知道如何进行?

首先,你可以用一行代码做你想做的事情:

find . | wc -l  
查找。
表示“在当前目录和所有子目录中搜索”。由于没有其他参数,它将简单地列出所有内容。然后,我使用一个管道和
wc
,它代表“字数”。
-l
选项表示“仅输出行数”

现在,对于您的代码,这里有一些提示。首先,我真的不明白为什么要重复代码三次(0美元、1美元和2美元)。你可以简单地做:

dir="$1"
if [ -z "$dir" ]; then dir="."; fi
将命令行参数的值存储在$dir中,如果未提供任何值,(-z表示“为空”),则为dir指定一个默认值

如果
$1
是目录的路径,则$1中的i的
将不起作用。因此,您可以使用

以美元表示的i(ls$dir)


此外,在代码中,您不会递归计数。这是自愿的还是您不知道如何继续?

您在哪里处理代码中的递归?你测试过吗?你在哪里处理代码中的递归?你测试过了吗?我想感谢你给我看了find命令,我以前从未真正弄糟过它。我必须能够接收多个目录并输出其包含的文件/目录总数,这就是为什么要使用$1和$2 if语句。现在,我只是想得到任何结果,递归是下一个!p、 对于递归搜索,我可以使用:'for i in$(ls-R$dir)'?不要对任何内容使用ls'输出。ls是一个交互式查看目录元数据的工具。任何试图用代码解析ls输出的尝试都将被中断。glob更简单、更正确:“*.txt”中的文件为“”。Read决不这样做:for x in$(command)或
命令
或$var。for in用于迭代参数,而不是(输出)字符串。相反,使用glob(例如.*.txt)、数组(例如“${names[@]}”)或while-read循环(例如while-read-r行)。请参阅和作为旁注:对于罕见的文件名包含新行字符的情况,
find.|wc-l
将崩溃。我要感谢您向我展示了find命令,我以前从未真正弄糟过它。我必须能够接收多个目录并输出其包含的文件/目录总数,这就是为什么要使用$1和$2 if语句。现在,我只是想得到任何结果,递归是下一个!p、 对于递归搜索,我可以使用:'for i in$(ls-R$dir)'?不要对任何内容使用ls'输出。ls是一个交互式查看目录元数据的工具。任何试图用代码解析ls输出的尝试都将被中断。glob更简单、更正确:“*.txt”中的文件为“”。Read决不这样做:for x in$(command)或
命令
或$var。for in用于迭代参数,而不是(输出)字符串。相反,使用glob(例如.*.txt)、数组(例如“${names[@]}”)或while-read循环(例如while-read-r行)。请参阅和作为旁注:对于罕见的文件名包含新行字符的情况,
find.|wc-l将断开。