【问题标题】:How to remove files based on a certain pattern from a certain year如何从某年删除基于某种模式的文件
【发布时间】:2020-02-01 22:47:46
【问题描述】:

我想从 2017 年或 2016 年或任何其他随机年份删除文件名中任何位置包含 ak 的文件。我知道这是错误的,因为我认为您不能通过管道传递到 rm 命令。如果 find 可能更好,我愿意接受建议

ls -ltr *ak* | grep '2017' | rm -rf

ls -ltr (在文件名的任何地方包含 x) | grep (x 年) | rm -rf 然而这并没有做任何事情

-rw-rw----   1   abinitio       0 2017 13:49 ks
-rw-rw----   1   abinitio       0 Sep 26 13:49 ks.txt
-rw-rw----   1   abinitio       0 Oct  3 15:35 a.txt
-rw-rw----   1   abinitio       0 Oct  3 15:35 abak.txt
-rw-rw----   1   abinitio       0 Oct  3 15:36 raks.txt
-rw-rw----   1   abinitio       0 Oct  3 15:36 aks.txt

所以这是我的输出,我的命令试图从这里 grep 日期,它应该返回并删除

-rw-rw----   1   abinitio       0 Oct  3 15:35 abak.txt
-rw-rw----   1   abinitio       0 Oct  3 15:36 raks.txt
-rw-rw----   1   abinitio       0 Oct  3 15:36 aks.txt

【问题讨论】:

标签: unix grep find rm


【解决方案1】:

当您谈论“文件名上的日期”时,您的意思似乎是 “过去一年”。

您可以使用“find”过滤您需要的确切日期来删除文件

find . -name "*ak*" -newermt $DATEA -not -newermt $DATEB -exec rm {} \+

检查它是否正常工作:

$ cat script.sh
  DATEA=$1
  DATEB=$2
  find . -name "*ak*" -newermt $DATEA -not -newermt $DATEB -exec rm {} \+
$ ls -lrta
 total 0
 -rw-rw-rw- 1 unixuser unixuser   0 Dec 31  2011 ak1
 -rw-rw-rw- 1 unixuser unixuser   0 Dec 31  2012 ak2
 -rw-rw-rw- 1 unixuser unixuser   0 Dec 31  2018 ak3
 drwxrwxrwx 1 unixuser unixuser 512 Oct  4 02:21 ..
 -rw-rw-rw- 1 unixuser unixuser   0 Oct  4 02:24 ak
 -rwxrwxrwx 1 unixuser unixuser 115 Oct  4 02:25 script.sh
 drwxrwxrwx 1 unixuser unixuser 512 Oct  4 02:25 .
$ ./script.sh 20120101 20190101
$ ls -lrta
total 0
-rw-rw-rw- 1 unixuser unixuser   0 Dec 31  2011 ak1
drwxrwxrwx 1 unixuser unixuser 512 Oct  4 02:21 ..
-rw-rw-rw- 1 unixuser unixuser   0 Oct  4 02:24 ak
-rwxrwxrwx 1 unixuser unixuser 115 Oct  4 02:25 script.sh
drwxrwxrwx 1 unixuser unixuser 512 Oct  4 02:25 .
$ 

【讨论】:

  • find 是一种合理的方法,但循环实现不是 - 请参阅 mywiki.wooledge.org/BashFAQ/001
  • 哈哈哈@EdMorton 来晚了,我不像你那样是 awk / sed 神!!!! :)
  • 你的意思是 -xargs??
  • @EdMorton,现在我明白了 -with exec 更好!!! :) 如果我错了,请纠正我!!!非常感谢您的文化和知识共享
  • -execxargs 都很好,甚至可以按照常见问题解答中所示的方式实现循环,而不是像您写的那样。您无需转义 + 顺便说一句。
【解决方案2】:

这个命令会帮助你。 小心点

 ls -ltr --full-time  *ak*  | grep '2017' | awk '{print $9}' | xargs rm -rf

另一种过滤日期和文件名的保证方式

ls -ltr --full-time  *ak* | awk '{print $6,  $9}'  | grep '2017' | awk '{print $2}' | xargs rm -rf

【讨论】:

  • 你好@EdMorton 我觉得自己是个坏学生 :)
  • 我实际上想显示问题“xargs rm -rf”为什么这个命令不起作用。
  • @ErdalTuran,Ed 是一个知识渊博的好人!!总是阅读他的帖子并考虑他的意见! :) 他让我们所有人都学习!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2014-03-26
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
相关资源
最近更新 更多