Answers:
您可以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
选项来获取行号。
cat
的-n
选择一无所知,这让我感到惊讶。我喜欢阅读随机问题。
命令替换
另一种选择是使用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
。处理包含空格字符的文件名以及包含文件名通配符的文件名也可能会遇到问题。
这将仅递归打印文本(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 {} \;
使用管道和xargs
find /* -name pg_hba.conf | xargs cat
如果由于缺少权限而失败,则可以使用sudo来确保您有权在要搜索的目录上执行find命令。
sudo find /* -name pg_hba.conf | xargs sudo cat
/tmp/ /dev/urandom /pg_hba.conf
,它将使root用户转储的全部内容/dev/urandom
。取决于上下文,可能会更糟。如果xargs
没有的-0
话,几乎永远不要使用。也sudo xargs
将优于xargs sudo
。而且/*
会更好/
。
find|xargs
不-0
应该被禁止),因此下投票。find
没有的输出-print0
不能可靠地进行后处理。-print0
不是标准的。话虽如此,标准sudo find / -name pg_hba.conf -exec cat {} +
也可能使您转储的内容/dev/urandom
(例如,如果有人从中创建了一个符号链接,/tmp/pg_hba.conf
并且没有一种简便的可移植的方式来解决这个问题,而这种方式至少没有竞争条件)。
sudo
“以防万一”,对吧?
sudo rm -rf /