Bash 如何创建包含文件夹中所有文件名称的数组?

Bash 如何创建包含文件夹中所有文件名称的数组?,bash,Bash,给定一个我的脚本以该文件夹的名称作为参数的文件夹,我如何创建一个数组,该数组将递归地包含该文件夹中所有文件的名称以及存在于该文件夹和其他文件夹中任何文件夹中的文件的名称 我试着这样做: #!/bin/bash function get_all_the_files { for i in "${1}"/*; do if [ -d "$i" ]; then get_all_the_files ${1} else i

给定一个我的脚本以该文件夹的名称作为参数的文件夹,我如何创建一个数组,该数组将递归地包含该文件夹中所有文件的名称以及存在于该文件夹和其他文件夹中任何文件夹中的文件的名称

我试着这样做:

#!/bin/bash

function get_all_the_files {
for i in "${1}"/*; do
         if [ -d "$i" ]; then 
            get_all_the_files ${1}
         else
            if [ -f "${i}" ]; then
                arrayNamesOfAllTheFiles=(${arrayNamesOfAllTheFiles[@]} "${i}")
            fi
         fi
done
}

arrayNamesOfAllTheFiles=()

get_all_the_files folder

declare -p arrayNamesOfAllTheFiles

但它不起作用。问题是什么?我如何解决它?

您几乎完全正确。递归调用中有一个小错误:

    if [ -d "$i" ]; then 
        get_all_the_files ${1}
    else
应该是

    if [ -d "$i" ]; then 
        get_all_the_files ${i}
    else
我要补充一点,在bash中使用这样的数组是非常不习惯的。如果您试图使用文件的递归树,则更常用的方法是使用find和xargs等工具


你几乎是对的。递归调用中有一个小错误:

    if [ -d "$i" ]; then 
        get_all_the_files ${1}
    else
应该是

    if [ -d "$i" ]; then 
        get_all_the_files ${i}
    else
我要补充一点,在bash中使用这样的数组是非常不习惯的。如果您试图使用文件的递归树,则更常用的方法是使用find和xargs等工具


要坚持在文件上循环设计,只插入常规文件,在每个步骤填充数组,但让Bash通过glob执行递归,可以使用以下方法:

# the globstar shell option enables the ** glob pattern for recursion
shopt -s globstar

# the nullglob shell option makes non-matching globs expand to nothing (recommended)
shopt -s nullglob

array=()

for file in /path/to/folder/**; do
    if [[ ! -h $file && -f $file ]]; then
        array+=( "$file" )
    fi
done
通过测试[[!-h$file&&-f$file]]我们测试文件是否不是符号链接和常规文件,如果不测试文件是否不是符号链接,您也将拥有解析为常规文件的符号链接

您还了解了要附加到数组的array+=stuff模式,而不是array=${array[@]}stuff

Bash的另一种可能性≥ 4.4如果实现了mapfile的-d选项,并使用支持-print0谓词的GNU find:

mapfile -d '' array < <(find /path/to/folder -type f -print0)

要坚持在文件上循环设计,只插入常规文件,在每个步骤填充数组,但让Bash通过glob执行递归,可以使用以下方法:

# the globstar shell option enables the ** glob pattern for recursion
shopt -s globstar

# the nullglob shell option makes non-matching globs expand to nothing (recommended)
shopt -s nullglob

array=()

for file in /path/to/folder/**; do
    if [[ ! -h $file && -f $file ]]; then
        array+=( "$file" )
    fi
done
通过测试[[!-h$file&&-f$file]]我们测试文件是否不是符号链接和常规文件,如果不测试文件是否不是符号链接,您也将拥有解析为常规文件的符号链接

您还了解了要附加到数组的array+=stuff模式,而不是array=${array[@]}stuff

Bash的另一种可能性≥ 4.4如果实现了mapfile的-d选项,并使用支持-print0谓词的GNU find:

mapfile -d '' array < <(find /path/to/folder -type f -print0)

如果任何文件名中有空格,这将中断,因为在分配数组元素之前有分词。@BenjaminW。绝对地我将删除$find。。。因为这从来都不是一个好主意。如果任何文件名中有空格,这会中断,因为在分配数组元素之前有分词。@BenjaminW。绝对地我将删除$find。。。因为这从来都不是一个好主意。你附加到数组中的方式将现有的文件名与空格分开。它应该在数组扩展arr=${arr[@]}$i周围使用引号,或者更容易使用+=运算符进行追加:arr+=$i。它是如何工作的?会发生什么?你能给出一个输入目录结构和预期输出的例子吗?你附加到数组的方式是用空格分割现有的文件名。它应该在数组扩展arr=${arr[@]}$i周围使用引号,或者更容易使用+=运算符进行追加:arr+=$i。它是如何工作的?会发生什么?您能给出一个输入目录结构和预期输出的示例吗?