我正在尝试执行此操作:
locate pg_type.h | cat
但这个命令与locate pg_type.h 没有什么不同
我应该改变什么?我想cat pg_type.h
无论在哪里pg_type.h
都能表演。
答案1
locate -e0 '*/pg_type.h' | xargs -r0 cat
locate pg_type.h
会找到路径中的所有文件pg_type.h
(例如,如果有一个rpg_type.horn
目录,您最终会显示其中的所有文件)。
如果没有-0
的输出,locate
则无法进行后处理,因为文件由换行符分隔,而换行符是文件名中完全有效的字符。
cat
如果没有参数,则将从 stdin 读取的内容写入 stdout,因此locate | cat
与 相同locate
,cat
只会传递 down 的输出locate
。您需要的是将文件列表传递为论点到cat
。
这就是xargs
通常的用途:将数据流转换为参数列表。是如果没有输入-r
则不调用。cat
如果没有-0
(这-r
不是标准的,但在许多实现中都可以找到,至少是那些 xargs 对任何东西有用的实现),xargs
只会寻找字在其输入中转换为参数,其中字以空格分隔,其中反斜杠、单引号和双引号可用于转义这些分隔符,因此通常不locate
使用该格式来显示文件名。
这就是为什么我们-0
对两者都使用locate
and选项xargs
,该选项使用 NUL 字符(这是文件路径中唯一不允许的字符)来分隔文件名。
另请注意,这locate
不是标准命令,并且存在大量具有不同版本以及不同选项和行为的不同实现。上面的代码至少适用于相对较新的 GNU 版本locate
以及mlocate
至少在基于 Linux 的操作系统上最常见的实现。
答案2
locate
您的命令将to的输出传递cat
到标准输入上。那不是你想要的。什么你locate
想要的是将to的输出cat
作为争论。
我相信做到这一点的方法是xargs
:
locate pg_type.h | xargs cat