在find命令中清空文件无效

4

我想清空大于30 MB的文件。我尝试使用 find 命令解决此问题。

   find . -maxdepth 1 -size +32M -exec cat /dev/null > {} \;

and

   find . -maxdepth 1 -size +32M -exec echo -n > '{}' \;

但这两个命令并没有清空文件。相反,它们创建了一个名为{}的文件。
为什么它不清空文件?为什么它会创建一个名为{}的文件?find命令有什么问题?
1个回答

7

解决方案

在这种情况下,你必须使用sh -c

 -exec sh -c "> {}" \;

使用示例

准备文件:

$ echo hello > a1
$ cp a1 a2; cp a1 b1; cp a1 b2
$ ls -l
total 16
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 a1
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 a2
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b1
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b2

执行命令:

$ find . -name 'a*' -exec sh -c '> {}' \;

检查结果:

$ ls -l
total 8
-rw-r--r-- 1 ic ic 0  6. Aug 14:45 a1
-rw-r--r-- 1 ic ic 0  6. Aug 14:45 a2
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b1
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b2
$ cat a1
$ cat b1
hello

如您所见,以字母 a 开头的文件现在为空;而其他文件不为空。

解释

当您执行类似以下操作时:

find . -maxdepth 1 -size +32M -exec cat /dev/null > {} \;

你需要将这个重定向操作放在exec命令之外,而不是其内部。
( find . -maxdepth 1 -size +32M -exec cat /dev/null )  ===> ( {} \; )

当然是不正确的。你必须在find执行的命令内部进行重定向。为此,必须在exec命令内运行一个新的shell。可以使用sh -c实现这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接