如何将Bash中find命令的输出传递给cat命令以读取文件内容?
解决find输出传给cat读取文件内容的问题
哈哈,这个坑我刚接触Linux的时候也踩过!咱们先搞清楚为啥原来的命令不行:
当你执行find -size 8c | cat时,find确实输出了./test.txt,但此时cat是从标准输入(也就是管道传过来的内容)读取数据,它会直接把收到的字符串打印出来,根本不会把这个字符串当成文件名去打开读取内容。cat <(find -size 8c)其实也是同理——<()会把find的输出包装成一个临时文件,cat读这个临时文件的内容就是那行文件名,自然还是输出文件名啦。
要让cat读取找到的文件内容,关键是要让cat把find输出的结果当成文件名参数,而不是输入文本。这里给你几种靠谱的方法:
用
xargs传递参数:find -size 8c | xargs catxargs的作用就是把管道过来的内容作为参数传给后面的cat,这样cat就会去打开这些文件读取内容了。如果你的文件名可能包含空格、特殊字符,建议用更安全的版本:find -size 8c -print0 | xargs -0 cat-print0让find用空字符分隔文件名,-0让xargs识别这种分隔方式,避免特殊字符导致的错误。用
find自带的-exec选项:
这是最稳妥的方式之一,直接让find对找到的文件执行cat命令:find -size 8c -exec cat {} \;这里
{}代表找到的每个文件名,\;是命令结束标记。如果想一次性把所有文件名传给cat(效率更高),可以把\;换成+:find -size 8c -exec cat {} +(不太推荐)用命令替换:
bash里也可以用$(...)把find的输出作为参数传给cat:cat $(find -size 8c)但这种方式在文件名包含空格、换行符或者特殊字符时很容易出错,所以优先考虑前两种方法。
内容的提问来源于stack exchange,提问作者Raphael Burkhardt
相关产品推荐
相关产品推荐

