如何将多行文件名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' ','
或者使用find
和paste
:
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/;
– 用\n
replace所有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