linux - 使用 shell 命令按日期删除文件并在文件名中关联日期

标签 linux shell grep

我正在学习 shell 命令,所以这可能是一个微不足道的问题。我有一些文件,文件模式是date-text1-text2.xml.gz

例子-

20140201-sometext1-sometext2.xml.gz

我想删除那些具有与其名称关联的日期并且该日期超过特定值的文件。

到目前为止,我所知道的是,我可以找到并删除具有某种模式的文件,比如

find . -name "2014022*-sometext1-sometext2-*.xml.gz | xargs rm

这将查找并删除从 20140220 到 20140228 的文件。我如何编写模式才能查找并删除从 20140220 到今天的所有文件。这将涉及更高级的脚本编写还是可以轻松完成?

最佳答案

请注意,使用前导零打印的日期(即 01 表示一月)形成一个单调的数字序列。一种简单的方法是在 awk 中进行过滤。

find . -type f -iname "20*" | awk -vFROM=20140110 '{ if (0+substr($1,3) >= FROM) print $1;}'

你找到所有匹配你的模式的文件,通过 -v 选项设置你不想保留的最小数字到 gawk 并简单地比较数字。您可以在 awk 单行代码中实现任意过滤逻辑。 './' 部分的 substr() 印章找到了用于比较的打印内容。 0+ 疯狂是为了确保 awk 确实比较数字而不是字符串。丑陋,但有时是必要的。

关于linux - 使用 shell 命令按日期删除文件并在文件名中关联日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24057645/

相关文章:

c++ - 如何在 linux 中将 libcurl 链接到我的 c++ 程序?

shell - 如何制作单个 shell 脚本来激活多个命令?

正则表达式:抓取两个单引号之间的第二个字符串

linux - 我们如何在 Linux 上合并 pdf 文件中的 2 页

multithreading - 如何在 Perl 中列出和终止线程/进程而不使用外部命令?

regex - Grep for word and line before match

regex - 多行 grep 正则表达式不起作用

linux - 使用 cmake 构建项目时出现 OpenCV 3.2.0 链接器错误

linux - RCP P2 在多用户环境中从只读安装更新

linux - 选择共享某些列(但不是全部)的行