2012-03-31 45 views
28

我试图将文件列表存储到一个数组中,然后再次遍历数组。 以下是当我从控制台运行ls -ls命令时得到的结果。如何将目录文件列表存储到数组中?

total 40 
36 -rwxrwxr-x 1 amit amit 36720 2012-03-31 12:19 1.txt 
4 -rwxrwxr-x 1 amit amit 1318 2012-03-31 14:49 2.txt 

我已经写入到上述数据存储到一个bash阵列以下bash脚本。

i=0 
ls -ls | while read line 
do 
    array[ $i ]="$line"   
    ((i++)) 
done 

但是当我echo $array,我什么都没有!

仅供参考,我运行脚本是这样的:./bashscript.sh

回答

28

与尝试:

#! /bin/bash 

i=0 
while read line 
do 
    array[ $i ]="$line"   
    ((i++)) 
done < <(ls -ls) 

echo ${array[1]} 

在您的版本,在子shell的while运行,您在循环修改环境变量是不可见在它之外。

(请记住,解析的ls输出一般为not a good idea at all

+0

'<(ls -ls)'你介意解释一下符号吗?我不明白为什么它不只是'LS -ls' – imagineerThat 2014-01-14 23:41:53

+1

见http://mywiki.wooledge.org/ProcessSubstitution – Mat 2014-01-15 04:36:56

4

这可能会为你工作:

OIFS=$IFS; IFS=$'\n'; array=($(ls -ls)); IFS=$OIFS; echo "${array[1]}" 
+1

或者简单:'IFS = $ '\ n' 阵列=($(LS -ls) )' – Guss 2015-08-17 19:00:58

70

我会使用

files=(*) 

然后如果您需要有关文件的数据(如大小),请在每个文件上使用stat命令。

+1

太棒了!即使前面加上目录名称,作品从多个目录(即'files_in_dirs =(DIR/* other_dir/*)',非常有用,感谢获取文件。 – 2013-09-06 21:15:35

+0

这应该是它 – 2015-04-10 08:51:05

+4

然后可以列出该文件中的所有元素数组:'回声$ {文件[@]}'或使用在for循环 – HankCa 2015-05-17 22:54:42

4

这里的一个变种,它允许您使用正则表达式模式进行初步筛选,改变正则表达式是得到你想要的过滤。

files=($(find -E . -type f -regex "^.*$")) 
for item in ${files[*]} 
do 
    printf " %s\n" $item 
done 
+0

这不适用于名称中包含空格的文件。 – chepner 2013-04-29 18:11:33

+0

我不明白为什么它不会 – harschware 2013-04-29 22:59:21

+1

分词适用于扩展命令替换,因此每个空格都会创建一个单独的数组元素。如果有一个名为'foo bar.txt'的文件,'item'将被设置为'foo',然后是'bar.txt'。 – chepner 2013-04-29 23:37:32

0

运行$(...)中的任何shell命令将有助于将输出存储在变量中。所以我们可以用IFS将文件转换为数组。

IFS=' ' read -r -a array <<< $(ls /path/to/dir) 
相关问题