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 ''
sed
after 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 coreutils
MacOS还提供的命令以前缀“ 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, hung
sed -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 ":" -
不确定所有版本的糊剂是否通用