【问题标题】:Linux delete file with size 0 [duplicate]Linux删除大小为0的文件[重复]
【发布时间】:2011-07-25 10:58:43
【问题描述】:

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

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

这样的?

【问题讨论】:

    标签: linux filesystems delete-file ls rm


    【解决方案1】:

    这将删除目录(及以下)中大小为零的所有文件。

    find /tmp -size  0 -print -delete
    

    如果你只想要一个特定的文件;

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

    【讨论】:

    • 快捷方式:[ -s /tmp/foo ] || rm /tmp/foo(测试大小是否为零,否则删除)。另请注意,如果文件/目录名称包含空格,xargs 是不安全的; find ... -exec rm '{}' \; 在这种情况下是安全的。
    • @Frank,您对xargs 的看法不正确。 '-print0` 和 xargs -0 更正了空格。
    • @FrankH:另外,即使使用find -exec,在可能的情况下,总是偏爱+ 而不是;(这是一种情况)。
    • 为了防止恶意文件名,rm --(注意尾随的-- 字符)是否比简单的rm 更安全? serverfault.com/questions/337082/…
    • @SimonBaars find /tmp -size 0 -print0 |xargs -0 echo rm
    【解决方案2】:

    你会想使用find:

     find . -size 0 -delete
    

    【讨论】:

    • 我会添加“-type f”,因​​为目录也被标记为大小为零。 “点”是可选的。
    • “点”对于 Linux 是可选的,但对于 Mac OS 不是可选的
    • 有一个-empty 选项:-)
    • @lilydjwg 没错,如果我们被允许使用非 POSIX 标志,find . -empty -delete 是最酷的。 :-)
    • 您可以为当前文件夹添加-maxdepth 1
    【解决方案3】:

    在当前目录和子目录中查找和删除空文件:

    find . -type f -empty -delete
    

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


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

    find -type f -empty -delete
    

    来自GNU find documentation

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

    【讨论】:

    • 非常优雅的解决方案!
    • 我会添加 -name '*.SomeFileExtension' 例如:如果您只想删除文本文件,那么我会使用:find . -name '*.txt' -type f -empty -delete
    • @jspek,好吧,这取决于您是否有特定用途...通常当您在寻找空文件时,您可以将它们全部杀死。 :)
    • 在包含 220 万个文件的目录上运行此命令后不得不喝杯咖啡。 :P 当我回来时,工作就像一个魅力,剩下 350.000。谢谢!
    【解决方案4】:

    您可以使用命令find 来执行此操作。我们可以用-type f匹配文件,用-size 0匹配空文件。然后我们可以删除-delete的匹配项。

    find . -type f -size 0 -delete
    

    【讨论】:

    • 找到 . -maxdepth 1 -type f -size 0 -delete 在当前目录中查找空文件而不进入子目录。
    【解决方案5】:

    在 Linux 上,当您不需要 find(1) 时,stat(1) 命令很有用:

    (( $(stat -c %s "$filename") )) || rm "$filename"
    

    这里的 stat 命令只允许我们获取文件大小,即-c %s(其他格式请参见手册页)。我正在运行 stat 程序并捕获它的输出,即$( )。此输出以数字形式显示,即外部(( ))。如果给定大小为零,即 FALSE,则执行 OR 的第二部分。非零(非空文件)为TRUE,所以不会执行rm。

    【讨论】:

      【解决方案6】:

      这适用于普通的 BSD,因此它应该与所有风格普遍兼容。下面,例如 pwd ( . )

      find . -size 0 |  xargs rm
      

      【讨论】:

      【解决方案7】:

      对于非递归删除(使用 du 和 awk):

      rm `du * | awk '$1 == "0" {print $2}'`
      

      【讨论】:

      • -bash: /usr/bin/du: 参数列表太长
      【解决方案8】:
      find . -type f -empty -exec rm -f {} \;
      

      【讨论】:

      • 你可以只使用 -delete 标志 - 保存一个 exec。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多