将 ls 写入数组(按换行符分割)

将 ls 写入数组(按换行符分割)

我希望我的目录在数组中列出输出。

readarray x < <( ls -la )
printf "%s" ${x[@]}

所以我写了这个,它有效,但它按空格而不是换行符分割。我在 readarray 手册中找不到“换行符”参数,所以我很好奇是否有一种巧妙的方法来解决该请求。请不要建议使用find(我被限制使用ls -la)。

我使用的是 bash 4.3。

答案1

它确实按行读取,但您忘记引用${x[@]}这意味着对其应用了 split+glob 运算符。

readarray x < <(ls -la)
printf %s "${x[@]}"

或者从每行中删除最后一个换行符:

readarray -t x < <(ls -la)
printf 'line: %s\n' "${x[@]}"

或者使用分割+全局操作员:

IFS=$'\n' # split on newline
set -o noglob
x=($(ls -la))

(与 相反readarray -t,该方法删除了空行(尽管不太可能出现在 的输出中ls -la))

如果您想获得文件名列表(包括隐藏的文件名)而不需要其他ls -l信息,您宁愿使用:

shopt -s nullglob dotglob
x=(*)

与 相反ls -a,它不包括.也不..包括。如果你真的想要它们,你会这样做:

shopt -s nullglob
x=(.* *)

相关内容