如何将目录文件列表存储到数组中?

时间:2012-03-31 09:26:45

标签: bash shell

我正在尝试将文件列表存储到一个数组中,然后再次遍历该数组。 下面是我从控制台运行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

6 个答案:

答案 0 :(得分:84)

我用

files=(*)

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

答案 1 :(得分:31)

尝试:

#! /bin/bash

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

echo ${array[1]}

在您的版本中,while在子shell中运行,您在循环中修改的环境变量在其外部不可见。

(请注意,解析ls的输出通常为not a good idea at all。)

答案 2 :(得分:5)

这是一个变体,它允许您使用正则表达式模式进行初始过滤,更改正则表达式以获得所需的过滤。

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

答案 3 :(得分:4)

这可能对您有用:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:-1)

您可能想使用 (*) 但如果目录包含 * 字符怎么办?正确处理文件名中的特殊字符非常困难。

您可以使用 ls -ls。但是,它无法处理换行符。

# Store la -ls as an array
readarray -t files <<< $(ls -ls)
for (( i=1; i<${#files[@]}; i++ ))
{
    # Convert current line to an array
    line=(${files[$i]})
    # Get the filename, joining it together any spaces
    fileName=${line[@]:9}
    echo $fileName
}

如果您只需要文件名,那么只需使用 ls

for fileName in $(ls); do
    echo $fileName
done

有关处理文件名中特殊字符的一些困难的更多信息,请参阅此 article 或此 this 帖子。