如何将多行文件名join自定义分隔符?

我想把ls -1的结果合并成一行,并用我想要的来划分它。

有没有我可以用来实现这个标准的Linux命令?

类似于第一个选项,但省略了尾随分隔符

 ls -1 | paste -sd "," - 

编辑 :只需“ ls -m ”如果你想你的分隔符是一个逗号

啊,力量和简单!

 ls -1 | tr '\n' ',' 

将逗号“ ”改为任何你想要的。 请注意,这包括“尾随逗号”

这将用换行符replace最后一个逗号:

 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的build议。

设置IFS和使用"$*"可以做你想要的。 我使用的是一个子shell,所以我不会干涉这个shell的$ IFS

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

为了捕捉输出,

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

我觉得这个很棒

 ls -1 | awk 'ORS=" "' 

通常不会parsingls ,所以替代方法是使用find ,例如:

 find . -type f -print0 | tr '\0' ',' 

或者使用findpaste

 find . -type f | paste -d, -s 

对于一般连接多行(与文件系统无关),请在Unix命令行中检查: 简明和可移植的“连接” 。

只是bash

 mystring=$(printf "%s|" *) echo ${mystring%|} 

不要重新发明轮子。

 ls -m 

它确实如此。

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

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

这个命令是给PERL的粉丝的:

 ls -1 | perl -l40pe0 

这里是40位的八进制ascii码。

-p将逐行处理并打印

-l将用我们提供的ascii字符来replace尾部的\ n。

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

0意味着实际上没有执行的命令。

perl -e0与perl -e“相同

您可以使用:

 ls -1 | perl -pe 's/\n$/some_delimiter/' 
 sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename] 

说明:

-e – 表示要执行的命令
:a – 是一个标签
/$/N – 定义当前和(N)ext行的匹配范围
s/\n/\\n/; – 用\nreplace所有EOL
ta; – 如果比赛成功,转到标签a

从我的博客采取。

如果你的版本的xargs支持-d标志,那么这应该工作

 ls | xargs -d, -L 1 echo 

-d是分隔符标志

如果您没有-d,则可以尝试以下操作

 ls | xargs -I {} echo {}, | xargs echo 

第一个xargs允许你在这个例子中指定你的分隔符(逗号)。

当连接到pipe道时, ls产生一个列输出,所以-1是多余的。

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

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

晦涩难懂的-0777让perl在运行程序之前读取所有input。

sed替代scheme,不留下尾随分隔符

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

它看起来像答案已经存在。

如果你想a, b, c格式,使用ls -m ( TulainsCórdova的答案 )

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

或者,如果你想要任何其他分隔符像| ,使用ls | paste -sd'|' ls | paste -sd'|' (应用阿尔乔姆的回答 )

ls选项-m", "逗号和空格分隔输出。

 ls -m | tr -d ' ' | tr ',' ';' 

将这个结果传递给tr去除空格或逗号将允许您再次将结果传送到tr来replace分隔符。

在我的例子中,我用分隔符replace了分隔符;

replace 与你喜欢的任何一个字符分隔符相关联 ,因为tr只占用你传入的string中的第一个字符作为参数。

您可以使用chomp合并单行中的多行:

perl -e'while(<>){if(/ \ $ /){chomp; } print;}'bad0>testing

在if语句中join换行符。它可以是特殊字符或任何分隔符。

在majkinetor的答案的顶部添加,这里是删除尾随分隔符的方式(因为我不能只是在他的答案评论):

 ls -1 | awk 'ORS=","' | head -c -1 

只要删除尽可能多的尾随字节作为分隔符。

我喜欢这种方法,因为我可以使用多字符分隔符+ awk其他好处:

 ls -1 | awk 'ORS=", "' | head -c -2