如何在“查找”命令的输出上使用“猫”命令?


13

我想将find命令的输出重定向到cat命令,以便可以打印给定文件的数据。

因此,例如,如果find的输出为/aFile/readme,则应将cat解释为cat ./aFile/readme。我如何立即做到这一点?

我必须使用管道吗?

我尝试了这个版本:

cat | find ./inhere -size 1033c 2> /dev/null

但是我猜这是完全错误的吗?当然,我确定输出仅是一个文件,而不是多个文件。

那我该怎么办呢?我已经在Google上进行搜索,但是找不到解决方案,可能是因为我没有正确搜索:P

Answers:


21

您可以find单独使用以下-exec操作执行此操作:

find /location -size 1033c -exec cat {} +

{}将扩展为找到的文件,+并使我们每次调用可以读取尽可能多的参数cat,因为cat可以采用多个参数。

如果您find没有+扩展名,或者想要一一读取文件:

find /location -size 1033c -exec cat {} \;

如果要使用的任何选项cat,请执行以下操作:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

在这里,我使用-n选项来获取行号。


因此,如果我是正确的:{}就像一个变量,它存储了find命令的输出,并且在“ +”号之后您应该编写cat参数?不是吗 编辑:好的,您编辑了帖子,现在您刚刚回答了我的问题:P Thanx man!解决了 !
Eksapsy

@ general656检查我的编辑
。– heemayl

1
我对cat-n选择一无所知,这让我感到惊讶。我喜欢阅读随机问题。
mazunki

1

命令替换

另一种选择是使用Command Substitution。在其中包装命令$()将运行该命令,并将命令替换为其输出。

cat $(find ./inhere -size 1033c 2> /dev/null)

会变成

cat ./inhere/file1 .inhere/file3

这或多或少等同于使用带有回勾的旧式包装命令:

cat `find ./inhere -size 1033c 2> /dev/null`

来自上面链接的文档的更多详细信息

Bash通过在子shell环境中执行命令并将命令替换替换为命令的标准输出来执行扩展,并删除所有尾随的换行符。嵌入的换行符不会被删除,但是可以在分词时将其删除。$(cat file)可以用等效但更快的命令替换命令替换$(< file)

当使用取代的旧式反引号形式,反斜杠保留其字面含义,随后当由除$`\。没有反斜杠的第一个反引号会终止命令替换。使用$(command)表格时,括号中的所有字符组成命令;没有一个被特别对待。

命令替换可以嵌套。要在使用反引号形式时嵌套,请使用反斜杠对内部反引号进行转义。

如果替换出现在双引号中,则不会对结果执行单词拆分和文件名扩展。

有关用法的一些良好示例,请参见此其他答案


请注意,如果find找到太多文件,则会在尝试调用时生成“参数列表太长”错误cat。处理包含空格字符的文件名以及包含文件名通配符的文件名也可能会遇到问题。
库萨兰达

-1

这将仅递归打印文本(ascii)文件的名称和内容。

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

再尝试一次

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

-2

使用管道和xargs

find /* -name pg_hba.conf | xargs cat

如果由于缺少权限而失败,则可以使用sudo来确保您有权在要搜索的目录上执行find命令。

 sudo find /* -name pg_hba.conf | xargs sudo cat

1
如果有人创建了一个名为的文件/tmp/ /dev/urandom /pg_hba.conf,它将使root用户转储的全部内容/dev/urandom。取决于上下文,可能会更糟。如果xargs没有的-0话,几乎永远不要使用。也sudo xargs将优于xargs sudo。而且/*会更好/
斯特凡Chazelas

1
OP希望使用cat在stdout上打印文件内容。因此,目的是由猫来实现的。问题是如何从find命令的输出中使用cat而不是sudo或find来打印文件的内容,以上命令解决了这个问题。是的,xargs -0是您指出的唯一建设性的东西。但是没有显示用法。尽量不要粗鲁。
应用工作

抱歉,这看起来很粗鲁。那不是意图。我想指出这些限制。你的回答显示了不好的做法(find|xargs-0应该被禁止),因此下投票。find没有的输出-print0不能可靠地进行后处理。-print0不是标准的。话虽如此,标准sudo find / -name pg_hba.conf -exec cat {} +也可能使您转储的内容/dev/urandom(例如,如果有人从中创建了一个符号链接,/tmp/pg_hba.conf并且没有一种简便的可移植的方式来解决这个问题,而这种方式至少没有竞争条件)。
斯特凡Chazelas

1
我们不要使用sudo“以防万一”,对吧?
lindhe

好吧,这比跑步好sudo rm -rf /
devinbost
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.