小智 625
与第一个选项类似,但省略了尾随分隔符
ls -1 | paste -sd "," -
Run Code Online (Sandbox Code Playgroud)
zaf*_*zaf 355
编辑:只需" ls -m "如果你想要你的分隔符是逗号
啊,力量和简洁!
ls -1 | tr '\n' ','
Run Code Online (Sandbox Code Playgroud)
将逗号" , " 更改为您想要的任何内容.请注意,这包括"尾随逗号"
Pau*_*ce. 26
这将使用换行符替换最后一个逗号:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
Run Code Online (Sandbox Code Playgroud)
ls -m 包括屏幕宽度字符的换行符(例如80).
主要是Bash(只是ls外部):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Run Code Online (Sandbox Code Playgroud)
在Bash 4中使用readarray(aka mapfile):
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Run Code Online (Sandbox Code Playgroud)
感谢gniourf_gniourf的建议.
maj*_*tor 19
我觉得这个很棒
ls -1 | awk 'ORS=","'
Run Code Online (Sandbox Code Playgroud)
ORS是"输出记录分隔符",所以现在你的行将用逗号连接.
gle*_*man 14
设置IFS和使用的组合"$*"可以做你想要的.我正在使用子shell,所以我不会干扰这个shell的$ IFS
(set -- *; IFS=,; echo "$*")
Run Code Online (Sandbox Code Playgroud)
要捕获输出,
output=$(set -- *; IFS=,; echo "$*")
Run Code Online (Sandbox Code Playgroud)
ken*_*orb 13
ls一般不解析,所以替代更好的方法是使用find,例如:
find . -type f -print0 | tr '\0' ','
Run Code Online (Sandbox Code Playgroud)
或者通过使用find和paste:
find . -type f | paste -d, -s
Run Code Online (Sandbox Code Playgroud)
对于一般连接多行(与文件系统无关),请检查:Unix命令行上的简洁和可移植"join".
不要重新发明轮子.
ls -m
Run Code Online (Sandbox Code Playgroud)
它正是如此.
除了 majkinetor 的回答之外,这里是删除尾随分隔符的方法(因为我还不能在他的回答下发表评论):
ls -1 | awk 'ORS=","' | head -c -1
Run Code Online (Sandbox Code Playgroud)
只需删除与分隔符数量相同的尾随字节即可。
我喜欢这种方法,因为我可以使用多字符分隔符 + 的其他好处awk:
ls -1 | awk 'ORS=", "' | head -c -2
Run Code Online (Sandbox Code Playgroud)
编辑
正如 Peter 所注意到的,本机 MacOS 版本的 head 不支持负字节数。然而,这可以很容易地修复。
首先,安装coreutils. “GNU 核心实用程序是 GNU 操作系统的基本文件、shell 和文本操作实用程序。”
brew install coreutils
Run Code Online (Sandbox Code Playgroud)
MacOS 也提供的命令以前缀“g”安装。例如gls。
完成此操作后,您可以使用ghead具有负字节数的哪个,或者更好的是,使用别名:
alias head="ghead"
Run Code Online (Sandbox Code Playgroud)
只是打击
mystring=$(printf "%s|" *)
echo ${mystring%|}
Run Code Online (Sandbox Code Playgroud)
此命令适用于PERL粉丝:
ls -1 | perl -l40pe0
Run Code Online (Sandbox Code Playgroud)
这里40是空间的八进制ascii代码.
-p将逐行处理并打印
-l将负责用我们提供的ascii字符替换尾部\n.
-e是告知PERL我们正在执行命令行.
0表示实际上没有执行命令.
perl -e0与perl -e'相同
sed方式,
sed -e ':a; N; $!ba; s/\n/,/g'
# :a # label called 'a'
# N # append next line into Pattern Space (see info sed)
# $!ba # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g # any substitution you want
Run Code Online (Sandbox Code Playgroud)
注意:
这在复杂性上是线性的,在所有行都附加到 sed 的模式空间后只替换一次。
@AnandRajaseka 的答案,以及其他一些类似的答案,例如这里,都是 O(n²),因为每次在模式空间中追加新行时,sed 都必须进行替换。
比较,
seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung
Run Code Online (Sandbox Code Playgroud)
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Run Code Online (Sandbox Code Playgroud)
解释:
-e- 表示要执行的命令
:a- 是一个标签
/$/N- 定义当前行和 (N)下一行的匹配范围
s/\n/\\n/;- 将所有 EOL 替换为\n
ta;- 如果匹配成功,则转到标签 a
摘自我的博客。
看起来答案已经存在。
如果您想要
a, b, c格式,请使用ls -m(Tulains Córdova 的回答)
或者,如果您想要a b c格式,请使用ls | xargs(Chris J's answer 的简化版本)
或者,如果您想要任何其他分隔符,例如|,请使用ls | paste -sd'|'(Artem 的答案的应用)