如何将ls -1的结果加入到一行中,并用我想要的任何内容将其分隔?


当前回答

为了避免tr的换行符混淆,我们可以在ls中添加-b标志:

ls -1b | tr '\n' ';'

其他回答

设置IFS和使用“$*”的组合可以实现您想要的功能。我使用了一个subshell,所以我不会干扰这个shell的$IFS

(set -- *; IFS=,; echo "$*")

为了捕获输出,

output=$(set -- *; IFS=,; echo "$*")

看起来答案已经存在了。

如果你愿意 a, b, c格式,使用ls -m (Tulains Córdova的答案)

或者如果你想要bc格式,使用ls | xargs (Chris J回答的简化版本)

或者如果你想要任何其他的分隔符,如|,使用ls |粘贴-sd'|' (Artem ' s answer的应用)

这个命令是为PERL爱好者准备的:

ls -1 | perl -l40pe0

这里的40是空格的八进制ascii码。

-p将逐行处理并打印

-l将负责用我们提供的ASCII字符替换尾随的\n。

-e是通知PERL我们正在执行命令行。

0表示实际上没有命令要执行。

Perl -e0与Perl -e ' '相同

Ls在连接到管道时产生一列输出,因此-1是多余的。

下面是另一个使用内置join函数的perl答案,它不留下尾随分隔符:

ls | perl -F'\n' -0777 -anE 'say join ",", @F'

晦涩的-0777使perl在运行程序之前读取所有输入。

不留下尾随分隔符的Sed替代方法

ls | sed '$!s/$/,/' | tr -d '\n'

用换行符替换最后一个逗号:

ls -1 | tr '\n' ',' | sed 's/,$/\n/'

Ls -m包含屏幕宽度字符处的换行符(例如第80行)。

主要是Bash(只有ls是外部的):

saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS

在Bash 4中使用readarray(又名mapfile):

readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS

感谢gniourf_gniourf的建议。