【问题标题】:Find big files and empty them查找大文件并清空它们
【发布时间】:2020-01-27 20:45:43
【问题描述】:

以下是否会在 /opt 目录中找到大日志文件(超过 1GB)并清空它们?

find /opt/ -type f -size +1G -exec cat > /dev/null {} \;

谢谢。

【问题讨论】:

  • 删除这些文件肯定比覆盖它们更有意义?
  • 或压缩它们...find /opt/ -type f -size +1G -exec bzip2 -v {} +

标签: bash cron


【解决方案1】:

这是需要的:

find /opt/ -type f -size +1G -exec cp /dev/null {} \;

代码中的重定向导致 cat 将大文件写入 /dev/null。

添加name 子句可能更安全:

find /opt/ -type f -name "*.log" -size +1G -exec cp /dev/null {} \;

【讨论】:

  • 你的意思是cp还是mv?
  • 我认为 OP 想要 cp,因为他可能不想删除日志文件。
  • 我不想删除日志文件,而是清空它。为什么不是猫?
  • cat 仍然可以,但cp 更简单、更干净,也许您可​​以接受其中一个答案?
  • @user10573594 如果您使用cat,则需要>,这是一个shell 重定向,但您的-exec 没有在shell 中运行。因此,如果您想使用 shell 重定向,您将需要 -exec bash -c 'cat ...' \;,然后您需要传递文件名的参数,这一切都会变得丑陋,并且每个文件需要 2 个进程(bashcat)。所以,正如 Philippe 所说,cp 更干净。
【解决方案2】:

如果你有 GNU coreutils,你可以像这样使用truncate

find /opt/ -type f -size +1G -exec truncate -s0 {} \;

【讨论】:

    【解决方案3】:

    您面临的问题是重定向 (>) 是 shell 的一个属性,而 cat 对此一无所知。

    解决您的问题的最简单方法可能只是将文件清空放入一个小的包装脚本中(它需要使用反斜杠转义 $,以使heredoc 不会扩展$@$f 但是而是将它们逐字写入包装脚本)。

    $ cat >/tmp/wrapper-script.sh  <<'EOL'
    #!/bin/sh
    
    for f in "$@"; do
      cat /dev/null > "${f}"
    done
    EOL
    
    $ chmod +x /tmp/wrapper-script.sh
    
    $ find /opt/ -type f -size +1G -exec /tmp/wrapper-script.sh {} +
    

    包装脚本遍历命令行中给出的所有文件并清空所有文件(注意find 调用中的+ 说明符)。

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 2010-10-19
      • 2014-06-27
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多