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

Pet*_*ter 2 ls bash array

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

readarray x < <( ls -la )
printf "%s" ${x[@]}
Run Code Online (Sandbox Code Playgroud)

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

我使用 bash 4.3。

Sté*_*las 7

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

readarray x < <(ls -la)
printf %s "${x[@]}"
Run Code Online (Sandbox Code Playgroud)

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

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

或者使用split+glob运算符:

IFS=$'\n' # split on newline
set -o noglob
x=($(ls -la))
Run Code Online (Sandbox Code Playgroud)

(与 相反readarray -rt,该方法虽然删除了空行(不太可能但并非不可能发生在 )的输出中ls -la

如果您想拥有没有其他ls -l信息的文件名列表(包括隐藏的),您宁愿使用:

shopt -s nullglob dotglob
x=(*)
Run Code Online (Sandbox Code Playgroud)

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

shopt -s nullglob
x=(.* *)
Run Code Online (Sandbox Code Playgroud)