0
find /ABC/ \
    -type f \
    -exec \
    sh -c  ' if [  echo "1" > ${1} ] ; then   if [ "$(cat ${1})" != "1" ]; then [ echo ${1} ]  ; fi ; fi ' _ {} \;

我的脚本想要这样做:

找到文件夹中的所有文件。将 1 写入文件。检查“1”是否写错。打印此文件的名称。

前。我做了这2个步骤。(1) 写 (2) 读检查。现在我将这两个结合在一起。因为我想在写入一个文件后立即检查。

但是我的脚本现在有问题。需要帮忙。谢谢你。它给出了我的错误:

sh: 1: unknown operand

我猜有些东西不匹配/因为我对外壳没有经验。需要各位帮忙

4

2 回答 2

1

尝试这个:

 find . -type f -exec sh -c 'echo "1" >> "${1}"; if [ "$(cat ${1})" != "1" ]; then echo "${1}" ; fi' _ {} \;

我没有测试你的命令,因为它从一开始就看起来不正确。

不过有几点注意事项:

echo "1" > "${1}"将破坏文件。>>如果要附加,请使用。

[是一个命令(也称为test.

then [ echo ${1} ]错误地使用了这个测试。你不需要在这里进行测试。

根据其他答案,您不需要if [ echo...,因此我完全对此进行了 if 测试。

于 2012-08-16T00:41:07.437 回答
1
if [  echo "1" > ${1} ] ; then

[是一个普通的命令。它是几乎所有的内置函数sh,但它仍然可以正常解析。所以> ${1}意味着“将输出重定向到名称作为参数传递的文件”。如果要比较两个数字,请使用-gt运算符:

if [ 1 -gt "$1" ]; then …

如果要写入1文件,请使用echo命令,而不是[ … ]条件命令(也可以在 name 下调用test):

if echo 1 >"$1"; then …

请注意,如果echo 1 >"$1"成功,那么文件很可能确实包含您放在那里的文本。唯一不会发生这种情况的是:

  • if$1是一个特殊文件,例如管道或设备(不会发生,因为它们不会被 匹配-type f);
  • 如果它们存在于一个特殊的文件系统上,你从文件中读取的内容不是最后写入的内容——这将是一个奇怪的文件系统,而不是用于磁盘存储的文件系统;
  • 如果其他程序同时修改了文件,由于时间窗口小,这不太可能但并非不可能。
于 2012-08-16T00:44:25.597 回答