如何获得一个文件夹中的变量文件的数量?(How to get the number of files

2019-06-25 15:29发布

使用bash,一个人如何能得到的文件数量的文件夹中,从shell脚本不包括目录,而解释抱怨?

在朋友的帮助下,我已经试过

$files=$(find ../ -maxdepth 1 -type f | sort -n)
$num=$("ls -l" | "grep ^-" | "wc -l")

从该命令行返回:

../1-prefix_blended_fused.jpg: No such file or directory
ls -l :  command not found
grep ^-: command not found
wc -l:   command not found

分别。 这些命令在命令行上工作,但不能与一个bash脚本。

鉴于充满了格式化像图像文件的文件1-pano.jpg ,我想抓住目录中的所有图像,以获得最大的编号的文件钉到正在处理的下一个图像。

为什么不一致?

Answer 1:

该报价是导致该错误消息。

要获得目录中的文件的数量:

shopt -s nullglob
numfiles=(*)
numfiles=${#numfiles[@]}

它创建一个数组,然后与它的元件的计数替换它。 这将包括文件和目录,而不是点文件或...或其他点目录。

使用nullglob所以空目录给出的0而不是1计数。

您可以改用find -type f或者你可以指望的目录和减:

# continuing from above
numdirs=(*/)
numdirs=${#numdirs[@]}
(( numfiles -= numdirs ))

另请参阅“ 我如何可以找到最新的(最新的,最早的,最古老的)目录中的文件吗? ”

只要你想执行块里面你可以有很多的空间。 他们往往有助于可读性。 唯一的缺点是,它们使文件大了一点,可能(只)稍慢初步分析。 有迹象表明,必须有空格的几个地方(例如,围绕[[[]]]=的比较)和少数不得(例如,围绕=在分配中。



Answer 2:

ls -l | grep -v ^d | wc -l

一条线。



Answer 3:

怎么样:

count=$(find .. -maxdepth 1 -type f|wc -l)
echo $count
let count=count+1 # Increase by one, for the next file number
echo $count

请注意,此解决方案是效率不高:它产生的子炮弹findwc的命令,但它应该工作。



Answer 4:

file_num=$(ls -1 --file-type | grep -v '/$' | wc -l)

这是比find命令有点轻量,并计算当前目录下的所有文件。



Answer 5:

摆脱报价。 外壳采用对待他们就像一个文件,所以它寻找“ls -l命令”。



Answer 6:

简单有效的方法:

#!/bin/bash
RES=$(find ${SOURCE} -type f | wc -l)


Answer 7:

删除qoutes,你将被罚款



Answer 8:

扩大对接受的答案(由Dennis W):当我尝试这个方法,我在猛砸4.4.5得到了迪尔斯不正确计数没有子目录。

的问题是,通过默认了nullglob未击并设置numdirs=(*/)设置与水珠图案的1个元件阵列*/ 。 同样我怀疑numfiles=(*)将具有为一个空文件夹1个元件。

设置shopt -s nullglob禁用nullglobbing解决了我的问题。 对于为什么在了nullglob不猛砸设置默认的精彩讨论看到这里的答案: 为什么没有了nullglob违约?

注:我会直接回答评论,但缺乏美誉度点。



Answer 9:

这里有一种方法可以做到这一个功能。 注意:您可以通过这个例子中,(目录数)显示目录,文件对文件计数或“全部”的目录中的一切计数。 因为我们不希望做不遍历树。

function get_counts_dir() {

    # -- handle inputs (e.g. get_counts_dir "files" /path/to/folder)
    [[ -z "${1,,}" ]] && type="files" || type="${1,,}"
    [[ -z "${2,,}" ]] && dir="$(pwd)" || dir="${2,,}"

    shopt -s nullglob
    PWD=$(pwd)
    cd ${dir}

    numfiles=(*)
    numfiles=${#numfiles[@]}
    numdirs=(*/)
    numdirs=${#numdirs[@]}

    # -- handle input types files/dirs/or both
    result=0
    case "${type,,}" in
        "files")
            result=$((( numfiles -= numdirs )))
        ;;
        "dirs")
            result=${numdirs}
        ;;
        *)  # -- returns all files/dirs
            result=${numfiles}
        ;;

    esac

    cd ${PWD}
    shopt -u nullglob

    # -- return result --
    [[ -z ${result} ]] && echo 0 || echo ${result}
}

使用功能的例子:

folder="/home"
get_counts_dir "files" "${folder}"
get_counts_dir "dirs" "${folder}"
get_counts_dir "both" "${folder}"

将打印类似:

2
4
6


文章来源: How to get the number of files in a folder as a variable?
标签: bash shell