如何用xargs将ls输出传入cat列文件名及给cat加文件名分隔
嘿,这两个bash小问题我太熟了,直接给你说最实用的解法:
问题1:用xargs把ls的输出传给cat实现列出文件名
其实单纯列文件名的话,ls本身就足够了,不过既然你指定要结合xargs和cat,分两种场景说:
- 如果只是想让cat原样输出ls列出的文件名(效果和
ls完全一致):
直接用ls | cat就行,cat会读取标准输入并原样打印。如果一定要加入xargs(虽然有点冗余),可以这么写:ls | xargs -I {} echo {} | cat - 如果你的真实需求是用cat显示这些文件的内容(这才是xargs+cat的常用场景):
普通场景(文件名无空格/特殊字符)用:ls *.txt | xargs cat
要是文件名带空格、引号这类特殊字符,稳妥写法是:ls -1 *.txt | xargs -d '\n' cat
这里-1让ls每行输出一个文件名,-d '\n'让xargs以换行符作为分隔符,避免拆分带空格的文件名。
问题2:给每个txt文件内容前加带序号的文件名标识
要简短易记的命令,首推for循环写法,直观还能处理带空格的文件名:
i=0; for f in /你的目标目录/*.txt; do echo "file #$((++i))"; cat "$f"; done
把/你的目标目录/换成实际路径就行,当前目录的话直接写*.txt。
要是想更简洁,也可以用awk一行搞定:
ls -1 /你的目标目录/*.txt | awk '{printf "file #%d\n", NR; system("cat \"" $0 "\"")}'
awk会自动用NR维护序号,先打印标识,再调用cat输出文件内容,双引号包裹文件名能兼容空格场景。
内容的提问来源于stack exchange,提问作者Thufir
相关产品推荐
相关产品推荐

