我希望能够将目录的内容存储在数组中。我知道你可以使用:
#!/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
但是对于包含任何空格的文件,输出是完全灾难。
如何在单个数组中存储目录及其所有子目录(及其子目录,如果需要)?
答案 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方法非常好用,因为它们会自动处理带有空格和其他特殊字符的文件名。