为什么管道不能与cat和locate一起使用?

为什么管道不能与cat和locate一起使用?

我正在尝试执行此操作:

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与 相同locatecat只会传递 down 的输出locate。您需要的是将文件列表传递为论点cat

这就是xargs通常的用途:将数据流转换为参数列表。是如果没有输入-r则不调用。cat如果没有-0(这-r不是标准的,但在许多实现中都可以找到,至少是那些 xargs 对任何东西有用的实现),xargs只会寻找在其输入中转换为参数,其中以空格分隔,其中反斜杠、单引号和双引号可用于转义这些分隔符,因此通常不locate使用该格式来显示文件名。

这就是为什么我们-0对两者都使用locateand选项xargs,该选项使用 NUL 字符(这是文件路径中唯一不允许的字符)来分隔文件名。

另请注意,这locate不是标准命令,并且存在大量具有不同版本以及不同选项和行为的不同实现。上面的代码至少适用于相对较新的 GNU 版本locate以及mlocate至少在基于 Linux 的操作系统上最常见的实现。

答案2

locate您的命令将to的输出传递cat到标准输入上。那不是你想要的。什么locate想要的是将to的输出cat作为争论

我相信做到这一点的方法是xargs

locate pg_type.h | xargs cat

相关内容