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

cod*_*mer 40 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
Run Code Online (Sandbox Code Playgroud)

我写的以下bash脚本将上述数据存储到bash数组中.

i=0
ls -ls | while read line
do
    array[ $i ]="$line"        
    (( i++ ))
done
Run Code Online (Sandbox Code Playgroud)

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

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

gle*_*man 88

我用了

files=(*)
Run Code Online (Sandbox Code Playgroud)

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

  • 然后列出这个文件数组中的所有元素:`echo $ {files [@]}`或者在for循环中使用它 (7认同)
  • 极好的!甚至可以使用前缀的目录名,从多个目录中获取文件(即 `files_in_dirs=(dir/* other_dir/*)`。非常有用,谢谢。 (4认同)
  • @David,带空格的文件没有问题:它们将作为单个元素正确存储在数组中.它正在从数组中提取文件作为一个需要小心的单元:`for filename in"$ {files [@]}"` - 其中引号至关重要.有关示例,请参阅[此答案](http://stackoverflow.com/a/12316565/7552). (3认同)
  • 在 Mac 上,当文件包含空格时,这似乎不起作用(不幸的是,这种情况很常见)。可能有解决方法。如果有人可以在 bash 文档中找到此语法的作用,这可能会帮助我们找到解决此问题的方法。 (2认同)
  • 如果没有"shopt -s nullglob",空目录将导致不可预测的错误. (2认同)

Mat*_*Mat 32

试试:

#! /bin/bash

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

echo ${array[1]}
Run Code Online (Sandbox Code Playgroud)

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

(请记住,解析输出ls通常不是一个好主意.)

  • 如果解析“ls”输出很糟糕(很糟糕),那么您为什么建议在答案中这样做?人们会错过免责声明,并认为通过“ls”进行解析就可以了。 (5认同)
  • `<(ls -ls)`你介意解释那个符号吗?我不明白为什么它不仅仅是`ls -ls` (2认同)
  • 清理文件列表:ls -1 (2认同)

pot*_*ong 5

这可能对你有用:

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

  • 或者更简单:`IFS=$'\n' array=($(ls -ls))` (2认同)

har*_*are 5

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

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

  • 分词适用于命令替换的扩展,因此每个空格都会创建一个单独的数组元素。如果有一个名为“foo bar.txt”的文件,“item”将被设置为“foo”,然后是“bar.txt”。 (2认同)