【问题标题】:How to store a directory's contents inside of an array如何将目录的内容存储在数组中
【发布时间】:2016-11-07 23:56:52
【问题描述】:

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

#!/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

但是对于包含任何空格的文件来说,输出是一场彻底的灾难。

如何将一个目录及其所有子目录(如果需要,还包括它们的子目录)存储在一个数组中?

【问题讨论】:

  • 您可以考虑探索这篇文章 - stackoverflow.com/questions/11584029/…
  • 您要归档什么?为什么需要使用数组?
  • @andlrc 我正在编写一个比较两个目录并搜索重复文件的脚本。该脚本将第一个目录的文件名存储在一个数组中,然后搜索第二个目录以查找文件的重复项。我认为数组将是存储和比较文件名以及文件校验和的好方法。我这样做是为了帮助自学 bash。

标签: arrays bash


【解决方案1】:

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

array+=("$value")

您的find|while 方法是正确的。正如您所推测的,您需要摆脱管道。您可以通过进程替换来做到这一点:

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

不使用find 的另一种方法是使用通配符。如果您只想要Directory 下的文件,那么简单如下:

array=(Directory/*)

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

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

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

【讨论】:

  • 我不确定 OP 是否确定他们想要什么,我认为答案可能是:my_arr=(Directory/*)
  • globstar 和路径名扩展的最大缺点是扩展的路径名存储在内存中(所有这些)。并且执行被停止,直到所有路径名都被扩展。考虑到 OP 想要将结果存储在数组中,这可能不是问题。我有一个悬而未决的问题,询问 OP 为什么需要一个数组。
  • @John Kugleman,谢谢!流程替换对我想要的效果很好。虽然语法不应该是while read -d $'\0' file; do arr1+=("$file") done &lt; &lt;(find Directory -print0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2016-08-22
  • 2014-07-14
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多