如何在数组中存储目录的内容

时间:2016-11-07 23:56:53

标签: arrays bash

我希望能够将目录的内容存储在数组中。我知道你可以使用:

#!/bin/bash

declare -A array

for i in Directory; do
     array[$i]=$i
done

将目录内容存储在关联数组中。但是如果目录中有子目录,我希望能够将它们及其内容存储在同一个数组中。我也尝试过使用:

declare -A arr1    

find Directory -print0 | while read -d $'\0' file; do
       arr1[$file]=$file
       echo "${arr1[$file]}"
    done

但这只是遇到了一个问题,一旦while循环结束,数组内容就会消失,因为子shell被从管道中丢弃(不确定我是否正确地描述了这一点)。

我甚至尝试了以下内容:

for i in $(find Directory/*); do
    arr2[$i]="$i"
    echo $i
done

但是对于包含任何空格的文件,输出是完全灾难。

如何在单个数组中存储目录及其所有子目录(及其子目录,如果需要)?

1 个答案:

答案 0 :(得分:0)

所以你知道,你不需要关联数组。将元素添加到常规索引数组的更简单方法是:

array+=("$value")

您的find|while方法正确。正如您所推测的那样,您需要摆脱管道。您可以使用流程替换来执行此操作:

while read -d $'\0' file; do
   arr1+=("$file")
done < <(find Directory -print0)

在没有find的情况下执行此操作的另一种方法是使用globbing。如果您只想让Directory下的文件简单如下:

array=(Directory/*)

如果您想要递归其所有子目录,可以启用globstar并使用**

shopt -s globstar
array=(Directory/**)

globbing方法非常好用,因为它们会自动处理带有空格和其他特殊字符的文件名。