如何将ls分配给Linux Bash中的数组?
array=${ls -d */} echo ${array[@]}
我有三个目录: ww
ee
qq
。 我想他们在一个数组,然后打印数组。
这将是这个
array=($(ls -d */))
编辑:请参阅戈登·戴维森的解决scheme为更一般的答案(即如果您的文件名包含特殊字符)。 这个答案只是一个语法修正。
只要有可能,你应该避免parsingls
的输出(参见Greg关于这个主题的wiki )。 基本上,如果在任何文件名中都有有趣的字符, ls
的输出将是不明确的。 这通常也是浪费时间。 在这种情况下,当你执行ls -d */
,会发生什么情况是shell将*/
扩展到子目录列表(这已经正是你想要的),把这个列表作为parameter passing给ls -d
,每个人都说,“是的,这是一个目录”,并打印出来。 ls
命令没有做任何有用的事情!
那么,好吧,它正在做一件有用的事情:如果没有子目录, */
将保持原样, ls
将查找名为“*”的子目录,找不到它,打印一条错误消息存在(到stderr), 并不打印“* /”(到标准输出)。
build立一个子目录名称数组的更简洁的方法是使用glob( */
) 而不将它传递给ls
。 但是为了避免在数组中放入“* /”,如果没有实际的子目录,你应该先设置nullglob(再次参见Greg的wiki ):
shopt -s nullglob array=(*/) shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later echo "${array[@]}" # Note double-quotes to avoid extra parsing of funny characters in filenames
如果你想打印一个错误信息,如果没有子目录,你最好自己做:
if (( ${#array[@]} == 0 )); then echo "No subdirectories found" >&2 fi
这将逐行打印这些目录中的文件。
array=(ww/* ee/* qq/*) printf "%s\n" "${array[@]}"
您可以使用ls
和-m
选项。
ARR=($(\ls -m * |tr"," " "| tr ":" " ")) echo ${ARR[@]}