将find命令的输出存储在数组中

时间:2011-11-21 14:25:21

标签: arrays bash

如何将find $1的结果放入数组?

for for循环:

for /f "delims=/" %%G in ('find $1') do %%G | cut -d\/ -f6-

5 个答案:

答案 0 :(得分:56)

我想哭。

在bash中:

 file_list=()
 while IFS= read -d $'\0' -r file ; do
     file_list=("${file_list[@]}" "$file")
 done < <(find "$1" -print0)

 echo "${file_list[@]}"

file_list现在是一个包含find "$1

结果的数组

“第6场”有什么特别之处?目前尚不清楚您尝试使用cut命令做什么。

你想在第6个目录之后剪切每个文件吗?

for file in "${file_list[@]}" ; do
    echo "$file" | cut -d/ -f6-
done

但是为什么“第6场”呢?我可以假设您实际上只想返回路径的最后一个元素吗?

for file in "${file_list[@]}" ; do
    echo "${file##*/}"
done

甚至

echo "${file_list[@]##*/}"

这将为您提供数组中每个路径的最后一个路径元素。你甚至可以用结果做点什么

for file in "${file_list[@]##*/}" ; do
    echo "$file"
done

bash程序元素的说明:

(一个人应该使用内置readarray代替)

find "$1" -print0

查找内容并'在标准输出上打印完整文件名,后跟空字符'。这很重要,因为我们稍后会将该输出拆分为空字符。

<(find "$1" -print0)

“进程替换”:find子进程的输出通过FIFO读入(即find子进程的输出在这里的行为类似于文件)

while ... 
done < <(find "$1" -print0)

find子进程的输出由while命令通过<

读取
IFS= read -d $'\0' -r file

这是暂时的条件:

read

读取一行输入(来自find命令)。 read的返回值为0,除非遇到EOF,此时退出。

-d $'\0'

...将空字符作为分隔符(请参阅bash手册页中的QUOTING)。这是因为我们之前使用-print0使用了空字符。

-r

反斜杠不被视为转义字符,因为它可能是文件名的一部分

file

结果(实际上是第一个单词,这里是唯一的)放入变量file

IFS= 

该命令与IFS一起运行,read是一个特殊变量,其中包含file_list=("${file_list[@]}" "$file") 将输入拆分为未设置的字符的字符。因为我们不想拆分。

在循环中:

$file

在循环内部,file_list数组只是由{{1}}增长,适当引用。

答案 1 :(得分:10)

arrayname=( $(find $1) )

我不明白你的循环问题?如果您看看如何使用该数组,那么在bash中,您可以遍历所有数组元素,如下所示:

for element in $(seq 0 $((${#arrayname[@]} - 1)))
do
        echo "${arrayname[$element]}"
done

答案 2 :(得分:1)

这可能不是100%万无一失,但它可能在99%的时间内工作(我使用GNU实用程序; BSD实用程序无法在没有修改的情况下工作;另外,这是使用ext4文件系统完成的):< / p>

declare -a BASH_ARRAY_VARIABLE=$(find <path> <other options> -print0 | sed -e 's/\x0$//' | awk -F'\0' 'BEGIN { printf "("; } { for (i = 1; i <= NF; i++) { printf "%c"gensub(/"/, "\\\\\"", "g", $i)"%c ", 34, 34; } } END { printf ")"; }')

然后你会像这样迭代它:

for FIND_PATH in "${BASH_ARRAY_VARIABLE[@]}"; do echo "$FIND_PATH"; done

确保在使用路径时将$ FIND_PATH括在双引号内。

答案 3 :(得分:1)

这是一个更简单的无管版本,基于user2618594的版本

declare -a names=$(echo "("; find <path> <other options> -printf '"%p" '; echo ")")
for nm in "${names[@]}"
do
    echo "$nm"
done

答案 4 :(得分:-5)

要遍历查找,您只需使用find:

即可
for file in "`find "$1"`"; do
    echo "$file" | cut -d/ -f6-
done

这是我从你的问题中得到的。

相关问题