将 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
的文件和名为 bar
和 foo
的两个文件;两者都将用连续的两行记录。为此,您需要使用 '%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 上工作
我想将从 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
的文件和名为 bar
和 foo
的两个文件;两者都将用连续的两行记录。为此,您需要使用 '%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 上工作