55

我正在尝试将列出的文件存储到一个数组中,然后再次遍历该数组。以下是我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

4

8 回答 8

125

我会用

files=(*)

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

于 2012-03-31T17:38:41.957 回答
39

尝试:

#! /bin/bash

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

echo ${array[1]}

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

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

于 2012-03-31T09:32:15.030 回答
7

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

files=($(find -E . -type f -regex "^.*$"))
for item in ${files[*]}
do
  printf "   %s\n" $item
done
于 2013-03-14T17:38:33.923 回答
5

这可能对您有用:

OIFS=$IFS; IFS=$'\n'; array=($(ls -ls)); IFS=$OIFS; echo "${array[1]}"
于 2012-03-31T12:10:14.500 回答
3

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

IFS=' ' read -r -a array <<< $(ls /path/to/dir)
于 2018-01-19T15:23:07.133 回答
0

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

您可以使用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

有关处理文件名中的特殊字符的一些困难的更多信息,请参阅这篇文章或这篇文章。

于 2021-02-06T11:43:22.673 回答
0

这两条代码行,无论是使用 scandir 还是在声明行中包含 dir pull ,都应该工作吗?

src_dir="/3T/data/MySQL";
# src_ray=scandir($src_dir);
declare -a src_ray ${src_dir/*.sql}
printf ( $src_ray );
于 2022-01-01T16:54:45.617 回答
0

只需您可以在下面使用这个 for 循环

declare -a arr
for file in *.txt
do
    arr=(${arrPi[*]} "$file")
done
于 2022-02-21T11:14:30.473 回答