我有以下行在 ksh 中不起作用但在 sh 中工作正常:
cat `find /home/peter/databases -name "cells.txt"`
如果此行位于 /usr/bin/sh 脚本内,则此操作有效。但当它位于 /usr/bin/ksh 内时则不然。
有任何提示为什么会这样吗?
我在用:
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 4
“不工作”意味着脚本挂起(类似于cat
未提供文件名作为参数的行为)
find /home/peter/databases -name "cells.txt"
ksh 脚本中的输出不为空。在这种情况下,脚本能够列出找到的文件。但是,如果我尝试使用上面提到的反引号来捕获找到的文件,就会出现问题。
find命令列出了近1000个文件,但大多数都是空的。上面说的 cat 命令在 sh 中有效,但在 ksh 中无效。
- 不存在包含名称空间的文件。
- 文件 cells.txt 的内容为空或单个语句。
- 如果 /home/peter/databases 下的文件数量较少,则命令 (cat `find /home/peter/databases -name "cells.txt"`) 可以正常工作。在本例中,文件数为 1000。
- 相同的命令在 SUSE 11.3 ksh 中运行。但是如果我在SUSE 11.4下执行它就会失败。
- 我只在 /home/peter/databases 下的目录中保留了几个名为 cells.txt 的文件,该命令运行得很好。当名为 cells.txt 的文件增长到大约 1000 个时,该命令不会给出任何输出(挂起)。我怀疑是因为某些缓冲区用于输出反引号吗? (``) 因为 SUSE 11.3 没有任何问题,但 11.4 挂起。
-size +0
该命令与 find 一起使用该选项。是否再次表明有关缓冲区的内容?
答案1
尝试将此作为替代解决方案,该解决方案cat
仅在找到文件时才会调用
find /home/peter/databases -type f -name 'cells.txt' -exec cat {} +
(如果您的版本find
不理解尾随+
,请将其替换为两个字符\;
)
答案2
该脚本通过忽略 find 命令中的零文件大小来工作。(-size +0)
cat `find /home/peter/databases -name "cells.txt" -size +0`
我也同意其他解决方案。但由于我的问题是找到 ksh 无法处理猫的原因是由于缓冲区大小(反引号的输出),所以我发布了我的答案。 @wurtel:谢谢。你的建议解决了这个问题。