如何将“ find”命令结果存储为Bash中的数组

我试图将结果保存find为数组。这是我的代码:


#!/bin/bash


echo "input : "

read input


echo "searching file with this pattern '${input}' under present directory"

array=`find . -name ${input}`


len=${#array[*]}

echo "found : ${len}"


i=0


while [ $i -lt $len ]

do

echo ${array[$i]}

let i++

done

我在当前目录下得到2个.txt文件。所以我期望'2'作为的结果${len}。但是,它打印1。原因是将所有结果都find作为一个元素。我怎样才能解决这个问题?


PS

我发现了几个解决方案,在计算器上有关类似问题。但是,它们有些不同,因此我无法申请。我需要在循环之前将结果存储在变量中。再次感谢。


慕斯王
浏览 3503回答 3
3回答

白衣染霜花

如果您使用bash4或更高版本,您可以取代你使用的find有shopt -s globstar nullglobarray=( **/*"$input"* )通过**启用的模式globstar匹配0个或更多目录,从而允许该模式匹配当前目录中的任意深度。如果没有该nullglob选项,则模式(在参数扩展之后)将按字面意义处理,因此,如果没有匹配项,则您将拥有一个包含单个字符串而不是一个空数组的数组。dotglob如果您想遍历隐藏的目录(如.ssh)并匹配隐藏的文件(如.bashrc),也将选项添加到第一行。

慕的地8271018

Bash 4.4 -d为readarray/ 引入了一个选项mapfile,因此现在可以通过以下方式解决readarray -d '' array < <(find . -name "$input" -print0)一种适用于任意文件名(包括空格,换行符和通配符)的方法。从手册中(省略其他选项):mapfile [-d delim] [array]-d的第一个字符delim用于终止每个输入行,而不是换行符。如果delim为空字符串,mapfile则在读取NUL字符时将终止一行。并且readarray只是的同义词mapfile。
打开App,查看更多内容
随时随地看视频慕课网APP