我想将命令的输出重定向find
到cat
命令,以便我可以打印给定文件的数据。
例如,如果 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