我该如何将 ls -1
的结果合并成一行,并使用任意分隔符delimit它?
paste -s -d
命令可以使用分隔符(例如","
)将多行文本合并为一行,并且最后不会留下分隔符:
ls -1 | paste -sd "," -
编辑:如果你想要逗号作为定界符,只需使用“ls -m”即可。
啊,威力和简洁!
ls -1 | tr '\n' ','
将逗号 "," 更改为您想要的任何字符。请注意,这包括一个“尾随逗号”(用于以换行符结尾的列表)
\n
,这也会被替换掉。 - codaddictls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
。 - Chrissed
命令可以更加高效,使用结束标记字符:
ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
- pieman72tr
之后再使用sed
似乎只是为了删除最后一个字���,这种做法似乎不太合理。我会选择使用ls -1 | tr '\n' ',' | head -c -1
。 - reddot这将把最后一个逗号替换为换行符:
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
mapfile
(Bash≥4),如下所示:mapfile -t files < <(ls -1)
。无需调整IFS
,而且更短。 - gniourf_gniourffiles=(*)
就可以正常工作。此外,对 *
的延迟评估将避免与 IFS 打交道:IFS=, command eval 'list=${files[*]}'; echo "<$list>"
。当然,IFS=, command eval echo '"${files[*]}"'
更短,但不会设置 $list
变量字符串。 - user8017719*
的扩展仅适用于一个字符。 - user8017719我认为这个很棒。
ls -1 | awk 'ORS=","'
ORS是“输出记录分隔符”,因此现在您的行将用逗号连接。
一般不建议解析ls
,更好的方法是使用find
,例如:
find . -type f -print0 | tr '\0' ','
或者通过使用find
和paste
:
find . -type f | paste -d, -s
如需一般性连接多行(与文件系统无关),请查看:Unix命令行上简洁且便携的“join”。
IFS
并使用 "$*"
的组合可以实现您想要的功能。我正在使用子shell,以免干扰当前shell中的 $IFS。(set -- *; IFS=,; echo "$*")
为捕获输出,output=$(set -- *; IFS=,; echo "$*")
set
如何工作的更多信息吗?对我来说看起来有点像巫术。浅显地查看man set
也没有给我带来太多信息。 - Ehtesh Choudhuryset
命令提供了一系列参数但没有选项,它会设置位置参数($1, $2, ...)。--
选项用于保护 set
命令,以防第一个参数(或在此情况下的文件名)恰好以破折号开头。请参阅 help set
中 --
选项的描述。我发现位置参数是处理事物列表的方便方法。我也可以使用数组来实现这个功能:output=$( files=(*); IFS=,; echo "${files[*]}" )
- glenn jackmanset -- *
后,通过延迟展开 *
一级,您可以获得正确的输出而无需使用子 shell:IFS=',' eval echo '"$*"'
。当然,这将更改位置参数。 - user8017719在 majkinetor 的回答基础上,这里是删除尾随分隔符的方法(因为我暂时无法在他的回答下进行评论):
ls -1 | awk 'ORS=","' | head -c -1
只需删除与您的分隔符数量相同的尾随字节。
我喜欢这种方法,因为我可以使用多字符分隔符+ awk 的其他优点:
ls -1 | awk 'ORS=", "' | head -c -2
编辑
正如Peter所注意到的,原生MacOS版本的head不支持负字节计数。然而这可以很容易地修复。
首先,安装coreutils
。 “GNU Core Utilities是GNU操作系统的基本文件、Shell和文本处理工具。”
brew install coreutils
在MacOS中,命令通常以"g"为前缀安装。例如gls
。
完成此操作后,您可以使用具有负字节计数的ghead
,或者更好地创建别名:
alias head="ghead"
ls -m
ls -m
和 tr
命令来删除逗号后面的空格,您可以执行 ls -m | tr -d ' '
。 - Andrewsed 's/, /,/g'
。 - glenn jackmanls -1 | perl -l40pe0
这里的40是空格的八进制ASCII码。
-p选项会逐行处理并打印输出。
-l选项会将每行末尾的\n替换为我们指定的ASCII字符。
-e选项告诉PERL我们正在进行命令行执行。
0表示实际上没有要执行的命令。
perl -e0和perl -e ' '是等效的。
只是Bash
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
。 - Christopherbash
和 gnu coreutils 的 printf
。 - ThorSummonerprintf -v
只能在 bash 中工作,而所示答案适用于许多 shell 类型。 - user8017719${mystring%|}
似乎是个好主意。 - user8017719
ls -1 | paste -s -d ":" -
不确定这是否适用于所有版本的paste。 - Andy Whitepaste (GNU coreutils) 8.22
中,paste
命令默认使用-
(标准输入)。 - fedorqui"\0"
指定,所以对我来说paste -sd "\0" -
是可行的! - Brad Parks