Linux删除大小为0的文件。

216

如果一个文件在linux中大小为0,我该如何删除它。我想在crontab中执行此操作,而不需要任何额外的脚本。

l filename.file | grep 5th-tab | not eq 0 | rm

像这样吗?

8个回答

333

这将删除目录中(包括子目录)所有大小为零的文件。

find /tmp -size 0 -print -delete

如果你只想获取特定的文件;

if [ ! -s /tmp/foo ] ; then
  rm /tmp/foo
fi

8
快捷方式:[ -s /tmp/foo ] || rm /tmp/foo(测试大小是否为零,否则删除)。另外要注意,如果文件/目录名包含空格,则使用xargs是不安全的; 在这种情况下,使用find ... -exec rm '{}' \;是安全的。 - FrankH.
11
@Frank,你对于 xargs 的理解是错误的。使用 -print0xargs -0 可以纠正空格的问题。 - Paul Tomblin
1
@FrankH:此外,即使使用find -exec,在可以使用+的情况下也应始终优先选择它而不是;(这就是这种情况之一)。 - C. K. Young
5
在这种情况下,使用rm --(注意尾部的“--”字符)比仅使用rm更安全,以防止不良文件名的出现。 - OnlineCop
2
@SimonBaars find /tmp -size 0 -print0 |xargs -0 echo rm - Paul Tomblin
显示剩余5条评论

273

你会想要使用find命令:

 find . -size 0 -delete

41
我会加上"-type f",因为目录的大小也会被标记为零。 "点"是可选的。 - Antonio
7
Linux中“点”是可选的,但在Mac OS中不是可选的。 - Jakub M.
9
有一个 -empty 选项 :-) - lilydjwg
11
@lilydjwg没错,如果允许使用非POSIX标志,find . -empty -delete是最酷的。 :-) - Anne van Rossum
2
你可以在当前文件夹中添加“-maxdepth 1”。 - aloisdg

150

搜索并删除当前目录和子目录中的空文件:

find . -type f -empty -delete

-type f 是必需的,因为即使目录也被标记为零大小。


点号.(当前目录)是起始搜索目录。如果你使用GNU find(例如不是Mac OS),则可以在这种情况下省略它:

find -type f -empty -delete

根据GNU find文档

如果没有指定要搜索的文件,则使用当前目录(.)。


1
非常优雅的解决方案! - Nick
2
我会添加-name '*.SomeFileExtension',例如:如果您想要删除仅文本文件,则我会使用:find . -name '*.txt' -type f -empty -delete - jspek
@jspek,这取决于你是否有特定的用途...通常当你想要空文件时,你是想全部删除它们。 :) - Antonio
2
在处理有220万个文件的目录时,我不得不去喝杯咖啡。:P 当我回来时,它已经完美地工作了,只剩下了35万个文件。谢谢! - ArendE

18
你可以使用命令find来实现这个功能。我们可以使用-type f来匹配文件,并使用-size 0来匹配空文件。然后,我们可以使用-delete删除匹配项。
find . -type f -size 0 -delete

1
找到当前目录中的空文件,而不进入子目录。命令为:find . -maxdepth 1 -type f -size 0 -delete - user7194913
稍微概括一下,注意传递给 -size 的值可以带有表示单位的后缀。默认情况下,单位不是字节。 - undefined

5
在Linux中,当你不需要使用find(1)命令时,stat(1)命令非常有用。
(( $(stat -c %s "$filename") )) || rm "$filename"

这里的stat命令使我们仅获取文件大小,即-c %s(有关其他格式,请参见man页面)。我正在运行stat程序并捕获其输出,即$( )。此输出以数字形式显示,即外部(( ))。如果文件大小为零,则为FALSE,因此执行OR的第二部分。非零(非空文件)为TRUE,因此不会执行rm操作。


5
这适用于普通的BSD系统,因此应与所有版本通用兼容。例如,在pwd(.)中。
find . -size 0 |  xargs rm

BSD 不支持 -delete 选项吗?https://www.freebsd.org/cgi/man.cgi?find(1) - Antonio
@Antonio至少OpenBSD 6.0不会这样。 - Colin 't Hart

1
对于非递归删除(使用du和awk):
请保留HTML标记,不做解释。
rm `du * | awk '$1 == "0" {print $2}'`

-bash: /usr/bin/du: 参数列表过长 - Anthony

1
find . -type f -empty -exec rm -f {} \;

1
你可以只使用-delete标志来保存exec。 - Yehosef

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