如何在“find”命令的输出上使用“cat”命令?

如何在“find”命令的输出上使用“cat”命令?

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

例如,如果 find 的输出是/aFile/readme那么 cat 应该被解释为cat ./aFile/readme。我怎样才能立即做到这一点?

我必须使用管道吗?

我尝试过这个版本:

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

但我想这是完全错误的?当然,我确信输出只是一个文件,而不是多个文件。

那么我该怎么做呢?我在谷歌上搜索但找不到解决方案,可能是因为我没有搜索正确:P

答案1

您可以find单独使用以下-exec操作来完成此操作:

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

{}将被替换为 找到的文件find,并且+使我们能够在每次调用时读取尽可能多的参数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选项来获取行号。

答案2

命令替换

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

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

会变成

cat ./inhere/file1 ./inhere/file2 ./inhere/file3

这或多或少相当于使用带有反引号的旧式包装命令:

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

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

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

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着$`\。前面没有反斜杠的第一个反引号终止命令替换。使用该$(command)形式时,括号内的所有字符组成命令;没有一个受到特殊对待。

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

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

这个另一个答案一些很好的用法示例。

答案3

这将仅递归地打印文本(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 {} \;

答案4

使用管道和 xargs

find /* -name pg_hba.conf | xargs cat

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

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

相关内容