在shell脚本中,find
命令用于搜索给定目录下符合搜索条件的的文件或子目录,如命令var=$(find "$PWD" -name "*.tsv")
表示搜索当前目录下的所有tsv文件。
find
命令的返回结果需要注意,`它的直接返回结果不是一个标准的shell array数据结构,而是一个shell variable,如果尝试通过索引号进行取值,0
索引的结果并不是返回所有结果的第一个元素,反而是输出全部返回结果,但是``0```索引之后的元素可以正常索引。如下所示 :
>ls -R
total 0
0 -rw-r--r-- 1 Nh_code GROUP 0 Jun 21 17:22 5.tsv
0 -rw-r--r-- 1 Nh_code GROUP 0 Jun 21 17:22 4.tsv
0 -rw-r--r-- 1 Nh_code GROUP 0 Jun 21 17:22 3.tsv
0 -rw-r--r-- 1 Nh_code GROUP 0 Jun 21 17:22 2.tsv
### 对find 命令的返回结果 var 尝试索引取值, ${var[0]} 的结果不是第一个元素,而是打印出find命令的全部返回结果
>var=$(find . -name "*.tsv" ) ; echo ${var[0]}
./4.tsv ./1.tsv ./3.tsv ./5.tsv ./2.tsv
### 但是除了第一个元素,其余元素都能通过索引号取值
>var=$(find . -name "*.tsv" ) ; echo ${var[1]}
./1.tsv
取值方法1-遍历
虽然无法通过索引号索引数组元素的方式取find
命令的返回值元素,但find
命令的返回结果是可以通过for
循环进行遍历的。
$for i in $(find . -name "*.tsv") ; do echo ${i} ; done
./4.tsv
./1.tsv
./3.tsv
./5.tsv
./2.tsv
取值方法2-转换成array
find
命令的返回结果可以通过在命令外围套一组括号来转换成shell array
数据结构,var_array=( `find . -name "*.tsv"` )
,这样find
命令的返回结果就是一个标准shell array
了。
$var_array=(`find . -name "*.tsv"`);echo ${var_array[0]}
./4.tsv
$var_array=(`find . -name "*.tsv"`);echo ${var_array[1]}
./1.tsv
参考资料
How can I store the "find" command results as an array in Bash - Stack Overflow