我想获取文件列表,然后将结果读入一个数组,其中每个数组元素都对应一个文件名。这可能吗?
Answers:
请勿使用ls
,这不是为此目的。使用地球。
shopt -s nullglob
array=(*)
array2=(file*)
array3=(dir/*)
nullglob
如果没有匹配项,则该选项使数组为空。
grep
,只需将字符串包括在您的glob中:array=(*.txt)
或array=(*foo*)
下面将在当前目录中创建一个带有ls输出的数组arr:
arr=( $(ls) )
尽管使用的输出ls
根本不安全。
比ls
您可以使用的更好,更安全echo *
:
arr=( * )
echo ${#arr[@]} # will echo number of elements in array
echo "${arr[@]}" # will dump all elements of the array
ls
是不必要的,不应用于此目的。
ls
应避免输出。
${arr[*]}
且${arr[@]}
相同。
arr=( $(ls) )
行。或者,如果您想离开它,请明确添加提及,例如不要这样做,因为它已被破坏。
实际上,ls
这不是要走的路。尝试这个:
declare -a FILELIST
for f in *; do
#FILELIST[length_of_FILELIST + 1]=filename
FILELIST[${#FILELIST[@]}+1]=$(echo "$f");
done
要从数组获取文件名,请使用:
echo ${FILELIST[x]}
要从以x开头的数组中获取n个文件名,请使用:
echo ${FILELIST[@]:x:n}
有关bash数组的出色教程,请参见:http : //www.thegeekstuff.com/2010/06/bash-array-tutorial/
array+=(element)
。没有理由只使用$(echo "$f")
直接进行分配。您的其中一项echo
陈述中缺少左花括号。
FILELIST = ( * )
?(或者,而是FILELIST += ( * )
)。为什么在地球上您使用$(echo "$f")
的不仅仅是正义"$f"
?
在bash中,您可以创建具有路径名扩展(globbing)的文件名数组,如下所示:
#!/bin/bash
SOURCE_DIR=path/to/source
files=(
"$SOURCE_DIR"/*.tar.gz
"$SOURCE_DIR"/*.tgz
"$SOURCE_DIR"/**/*
)
上面的代码将创建一个名为的数组files
并将N个数组元素添加到数组中,其中数组中的每个元素都对应于SOURCE_DIR
结尾于.tar.gz
或的项目.tgz
,或者其子目录中的任何项目,并且丹尼斯在评论中指出可以进行子目录递归。
然后,您可以printf
用来查看包含路径的数组的内容:
printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz
或使用参数替换来排除路径名:
printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz
shopt -s globstar
使用递归globlob(**
)。
globstar
。echo /usr/**/ | wc -c
为您的输出计算某些目录名称中的字符有什么作用?在我的Mac上,在具有Bash 3.2的Sierra中或在具有Bash 4.4的情况下(globstar
关闭),其输出为122。如果globstar
在打开时运行Bash 4.4 ,则得到277904。后者显然是递归的,而前者不是。shopt
定义了BTW,但我想您的意思是globstar
(在Bash 3.2中shopt -p globstar
给出了一个错误,在Bash 4.4中它显示了它是已设置还是未设置)。
hash
仅适用于外部可执行文件(tryhash -t ls
和help hash
),不会显示任何内容,shopt
因为它是内置文件,也不是globstar
因为它是选项而不是可执行文件。尝试type -a shopt
显示shopt
来自何处以及shopt
单独显示所有选项的设置。使用echo "$BASH_VERSION"
以显示您当前运行的外壳的版本(如果它的击),并期待在输出ps -o tty,command
,看看它实际上是/bin/bash
。比较find /usr -type d | wc -l
并echo /usr/**/ | tr -cd " " | wc -c
...
尝试这个,
path="" # could set to any absolute path
declare -a array=( "${path}"/* )
我假设您稍后会从列表中删除不需要的内容。