首页 > 解决方案 > 如何将 find 的结果存储在 bash 数组中,以将结果用作 bash 脚本中的文件路径?

问题描述

在 bash 数组中使用以下命令时,它会丢失数组元素的行分隔。

array=$(find "${PWD%/*}" -name '*.dmg')

如果我重定向 find 命令的路径,而不将其存储在变量中,而是将其存储到文本文件中,它会给出所需的结果。

find "${PWD%/*}" -name '*.dmg' > Out.txt

但我想将结果用作 Bash 中的变量并循环遍历它。在这种情况下,find 命令应该返回一个数组,其中包含一个目录中所有 .dmg 文件的路径。我想用hdiutilmount 命令遍历这个数组,以便挂载.dmg目录中的所有文件。

标签: arraysbashmacosfind

解决方案


您可以使用mapfile将找到的文件安全地传输到数组中。

#!/usr/bin/env bash
declare -a array

mapfile -d '' array < <(find "${PWD%/*}" -name '*.dmg' -print0 2>/dev/null)

find -print0选项产生空分隔的字符串,因此文件名中的空格、制表符和回车被安全地保留。

mapfile -d '' array使用空分隔符读取stdin以填充array

< <(commands group)将命令组的输出注入到stdin其他命令组中。

结果是, 的输出find被映射到array

对于缺少 MacOS 的旧版 Bash 3.2 mapfile,这是另一种填充方式array

#!/usr/bin/env/bash

declare -a array

while read -r -d ''; do
    array+=("$REPLY")
done < <(find "${PWD%/*}" -name '*.dmg' -print0 2>/dev/null)

推荐阅读