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

时间:2015-04-10 15:36:33

标签: shell scripting

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

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

4 个答案:

答案 0 :(得分:1)

最简单的方法是编写一个为您完成此操作的小脚本,并使用该脚本代替系统的真实rm程序。所以你可以写下这样的东西并保存为$HOME/RemoveLogs

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

然后,在终端中,键入以下一次以使脚本可执行

chmod +x $HOME/RemoveLogs

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

即可
$HOME/RemoveLogs

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

答案 1 :(得分:0)

鉴于评论中澄清的用例 - 您并未尝试记录所有rm的使用,而是从构建过程调用的特定实例(或在构建过程之后清理一个cron作业):

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

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

答案 2 :(得分:0)

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

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

rm -f *.log

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

假设您只想删除当前目录中的所有*.log文件,并将其名称附加到xyz.abc,请按以下步骤操作:

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

答案 3 :(得分:0)

我无法在上述的find命令中运行rm,这似乎是查找,删除和记录的最佳实践,也是我使用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-防止其失控
  • 类型-确保仅文件
  • -名称-确保仅过滤您的名称
  • -print-将结果发送到stdout
  • -删除-删除所述文件
  • >>-附加到文件中不会被覆盖>创建新文件

在CENTOS7上为我工作