将 rm -rf 的输出附加到文件

append output of rm -rf to a file

我想将从 rm -rf *.log 中删除的文件名附加到另一个文件,比如 xyz.abc。有没有办法做到这一点?

它应该将所有 .log 文件附加到 xyz.abc。尝试过但失败了,所以在这里问。

最简单的方法是编写一个小脚本来代替系统的真实 rm 程序。所以你可以写这样的东西并将其保存为 $HOME/RemoveLogs

#!/bin/bash
find . -maxdepth 1 -name \*.log -print -exec rm {} +; >> xyz.abc

然后,在终端中,只需输入一次以下命令即可使脚本可执行

chmod +x $HOME/RemoveLogs

然后,只要您想删除日志,只需 运行

$HOME/RemoveLogs

或者,如果您记忆力好并且喜欢输入,您可以直接在终端中输入上面的 find 命令:-)

考虑到在评论中阐明了用例——您不是要记录 所有rm 的使用,而是记录从构建中调用的特定实例进程(或在所述构建过程之后清理的 cron 作业):

printf '%s\n' *.log >>deletedFiles
rm -f -- *.log

请注意,这不会区分名为 bar$'\n'foo 的文件和名为 barfoo 的两个文件;两者都将用连续的两行记录。为此,您需要使用 '%q\n'(如果您的 shell 是 bash)或 %s[=17=] 作为您的格式字符串;前者会以评估安全的形式生成您的日志(人类很容易阅读,很难从 shell 安全地解析);后者将以 NUL 分隔的形式生成它(人类难以阅读,易于被任何语言的机器解析);两者在所有可能的文件名中都是明确的。

命令rm -rf *.log不打印任何输出;它会静默删除指定的文件。

-r 选项 可能 在这种情况下没有多大意义,并且可能存在危险。如果您要删除当前目录中的所有 *.log 个文件,您只需要

rm -f *.log

仅当您有一个或多个名称以 .log 结尾的 目录 时,-r 才有意义;然后它将递归地删除这些目录及其所有内容。

假设您只想删除当前目录中的所有 *.log 文件并将它们的名称附加到 xyz.abc,我会这样做:

for file in *.log ; do
    echo "$file" >> xyz.abc
    rm -f "$file"
done

我无法在上面的查找命令中获取 rm 运行ning,这似乎是查找、删除和记录的最佳实践,也是我使用 shell 脚本实现自动化的解决方案(不是一定是最佳实践)

来自名为 removelogs.sh 的 shell 脚本 运行终端

中的命令sh removelogs.sh

这是 removelogs.sh 文件中的文本。

cd /var/log;
date >> /var/log/removedlogs.txt;
find . -maxdepth 4 -type f -name \*log.old -delete -print >> /var/log/removedlogs.txt
  • 。 - 在这个位置 运行!!!所以确保你不 运行 在根文件夹中!!!
  • -maxdepth - 防止失控
  • -type - 确保只有文件
  • -name - 确保只有您筛选的名称
  • -print - 将结果发送到标准输出
  • -delete - 删除上述文件
  • >> - 附加到文件而不是覆盖 > 创建新文件

我在 CENTOS7 上工作