Answers:
与第一个选项相似,但省略了结尾的定界符
ls -1 | paste -sd "," -paste获取-(标准输入)作为默认,至少在我的paste (GNU coreutils) 8.22。
                    "\0",所以paste -sd "\0" -对我有用!
                    编辑:只需“ ls -m ”如果您希望分隔符是逗号
啊,力量和简单!
ls -1 | tr '\n' ','更改逗号“ ”你想要什么。请注意,这包括“尾随逗号”
\n,也将替换它。
                    ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
                    sed可以使用结束标记字符来提高效率:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
                    sedafter tr似乎只是删除最后一个符号似乎是不合理的。我ls -1 | tr '\n' ',' | head -c -1
                    这用换行符替换最后一个逗号:
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(aka mapfile):
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS感谢gniourf_gniourf的建议。
mapfile(击≥4)为:mapfile -t files < <(ls -1)。无需摆弄IFS。而且它也更短。
                    IFS用来加入以下字段:saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS。或者,如果您要使用一个以上字符的分隔符,请使用另一种方法。
                    设置IFS和使用的结合"$*"可以做您想要的。我使用的是子外壳,因此我不会干扰该外壳的$ IFS
(set -- *; IFS=,; echo "$*")要捕获输出,
output=$(set -- *; IFS=,; echo "$*")set工作原理的信息?在我看来有点像巫毒教。浅看man set也没有给我太多信息。
                    set一堆参数但没有选项,它将设置位置参数($ 1,$ 2,...)。如果第一个参数(在这种情况下为文件名)恰好以短划线开头,--则可以保护set它。请参阅中有关--选项的说明help set。我发现位置参数是处理事物列表的便捷方法。我也可以使用数组来实现:output=$( files=(*); IFS=,; echo "${files[*]}" )
                    type set您所愿,set is a shell builtin。因此,man set将无济于事,但help set会做到的。答案:“-将其余所有参数分配给位置参数。”
                    set -- *。延迟*一级扩展,无需子shell即可获得正确的输出IFS=',' eval echo '"$*"'。当然,这将改变位置参数。
                    ls一般而言,不建议进行解析,因此更好的替代方法是使用find,例如:
find . -type f -print0 | tr '\0' ','或使用find和paste:
find . -type f | paste -d, -s对于一般的多行连接(与文件系统无关),请检查:在Unix命令行上简洁且可移植的“连接”。
只是扑
mystring=$(printf "%s|" *)
echo ${mystring%|}|,@ camh 不会让结尾处显得多余。
                    bash和gnu coreutilsprintf
                    printf -v仅适用于bash,而给出的答案适用于许多shell类型。
                    |同时使用了以下两行,它将删除尾部:printf -v mystring "%s|" * ; echo ${mystring%|}。
                    此命令适用于PERL粉丝:
ls -1 | perl -l40pe0这里40是空间的八进制ASCII码。
-p将逐行处理并打印
-l将用我们提供的ascii字符替换尾随\ n。
-e通知PERL我们正在执行命令行执行。
0表示实际上没有命令要执行。
perl -e0与perl -e''相同
看来答案已经存在。
如果要
 a, b, c格式化,请使用ls -m(TulainsCórdova的答案)
或者,如果您要a b c格式化,请使用ls | xargs(Chris J答案的简化版)
或者,如果您希望使用任何其他定界符,例如|,请使用ls | paste -sd'|'(Artem的答案的应用)
除了majkinetor的答案之外,这是删除尾部定界符的方法(因为我还不能只在他的答案下发表评论):
ls -1 | awk 'ORS=","' | head -c -1只需删除定界符计数的尾随字节数即可。
我喜欢这种方法,因为我可以使用多字符定界符+的其他优点awk:
ls -1 | awk 'ORS=", "' | head -c -2编辑
正如Peter所注意到的,本地MacOS版本的head不支持负字节计数。但是,这很容易解决。
首先,安装coreutils。“ GNU核心实用程序是GNU操作系统的基本文件,shell和文本操作实用程序。”
brew install coreutilsMacOS还提供的命令以前缀“ g”安装。例如gls。
完成此操作后,您可以使用ghead哪个字节数为负,或者更好的是使用别名:
alias head="ghead"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注意事项:
这是线性的复杂性,仅在将所有行附加到sed的模式空间中之后替换一次。
@AnandRajaseka的答案以及其他一些类似的答案(例如here)为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, hungsed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]说明:
-e-表示要执行的命令
   :a-是标签
   /$/N-定义当前和(N)ext行的匹配范围
   s/\n/\\n/;-将所有EOL替换为\n
   ta;-如果匹配成功,则转到标签a
取自我的博客。
具有尾部斜杠处理的快速Perl版本:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'解释:
ls -1 | paste -s -d ":" -不确定所有版本的糊剂是否通用