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

Gáb*_*rga 11 arrays bash

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

在for循环中:

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

Sor*_*gal 59

我想哭.

在bash中:

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

 echo "${file_list[@]}"
Run Code Online (Sandbox Code Playgroud)

file_list 现在是一个包含结果的数组 find "$1

"第6场"有什么特别之处?目前尚不清楚你试图用你的cut命令做什么.

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

for file in "${file_list[@]}" ; do
    echo "$file" | cut -d/ -f6-
done
Run Code Online (Sandbox Code Playgroud)

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

for file in "${file_list[@]}" ; do
    echo "${file##*/}"
done
Run Code Online (Sandbox Code Playgroud)

甚至

echo "${file_list[@]##*/}"
Run Code Online (Sandbox Code Playgroud)

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

for file in "${file_list[@]##*/}" ; do
    echo "$file"
done
Run Code Online (Sandbox Code Playgroud)

bash程序元素的说明:

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

find "$1" -print0
Run Code Online (Sandbox Code Playgroud)

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

<(find "$1" -print0)
Run Code Online (Sandbox Code Playgroud)

"进程替换":find通过FIFO读取子进程的输出(即子进程的输出在find这里表现得像一个文件)

while ... 
done < <(find "$1" -print0)
Run Code Online (Sandbox Code Playgroud)

find子进程的输出由while命令via 读取<

IFS= read -d $'\0' -r file
Run Code Online (Sandbox Code Playgroud)

这是条件:

read
Run Code Online (Sandbox Code Playgroud)

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

-d $'\0'
Run Code Online (Sandbox Code Playgroud)

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

-r
Run Code Online (Sandbox Code Playgroud)

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

file
Run Code Online (Sandbox Code Playgroud)

结果(实际上第一个单词,这里是唯一的)被置于变量中 file

IFS= 
Run Code Online (Sandbox Code Playgroud)

该命令运行时IFS,特殊变量包含read将输入拆分为未设置的字符的字符.因为我们不想拆分.

在循环内:

file_list=("${file_list[@]}" "$file")
Run Code Online (Sandbox Code Playgroud)

在循环内部,file_list数组刚刚生长$file,适当引用.

  • +1这是正确的方法; 它处理文件名中的空格和其他有趣的字符,所有其他发布的答案都失败了. (4认同)
  • JonathanY.:您需要阅读[参数替换](http://tldp.org/LDP/abs/html/parameter-substitution.html).熟悉[BashFAQ](http://mywiki.wooledge.org/BashFAQ). (2认同)

Cou*_*gar 12

arrayname=( $(find $1) )
Run Code Online (Sandbox Code Playgroud)

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

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


gus*_*tkg -5

要循环查找,您可以简单地使用 find:

for file in "`find "$1"`"; do
    echo "$file" | cut -d/ -f6-
done
Run Code Online (Sandbox Code Playgroud)

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

  • 那样还是不行。您只需执行一次循环,其中“file”被分配包含“find”找到的所有文件的字符串。另外,在双引号内使用双引号是很有趣的。 (9认同)
  • 如果文件名包含空格,这不起作用! (3认同)