【问题标题】:Remove all files with a common prefix except the N latest modified删除所有具有公共前缀的文件,N个最新修改的除外
【发布时间】:2020-10-26 16:54:29
【问题描述】:

我正在尝试创建一个 bash 命令/脚本来删除目录中早于 X 天且以某个子字符串开头的所有文件。

例如,如果我们的目录包含文件

-rw-r--r-- 1 root root 0 Jun 30 10:22 foo_5
-rw-r--r-- 1 root root 0 Jun 29 10:22 bar_4
-rw-r--r-- 1 root root 0 Jun 29 10:22 foo_4
-rw-r--r-- 1 root root 0 Jun 28 10:22 bar_3
-rw-r--r-- 1 root root 0 Jun 28 10:22 foo_3
-rw-r--r-- 1 root root 0 Jun 27 10:22 bar_2
-rw-r--r-- 1 root root 0 Jun 27 10:22 foo_2
-rw-r--r-- 1 root root 0 Jun 26 10:22 foo_1

我们要删除所有foo* 文件,除了最近的 2 个文件。这将导致目录

-rw-r--r-- 1 root root 0 Jun 30 10:22 foo_5
-rw-r--r-- 1 root root 0 Jun 29 10:22 bar_4
-rw-r--r-- 1 root root 0 Jun 29 10:22 foo_4
-rw-r--r-- 1 root root 0 Jun 28 10:22 bar_3
-rw-r--r-- 1 root root 0 Jun 27 10:22 bar_2

我目前只能删除除 2 个最近的文件之外的所有文件,这将影响 bar* 文件。

ls -t | tail -n +4 | xargs rm --

我们如何才能将我们的删除限制为以某个字符串开头的文件?


创建测试文件的代码

(
touch -d "6 days ago" foo_5
touch -d "7 days ago" foo_4
touch -d "7 days ago" bar_4
touch -d "8 days ago" foo_3
touch -d "8 days ago" bar_3
touch -d "9 days ago" foo_2
touch -d "9 days ago" bar_2
touch -d "10 days ago" foo_1
)

【问题讨论】:

  • 试试ls -t foo*
  • 为什么不能使用find?如果您要查找已修改或 -atime 仅用于访问,请查找 -mtime 属性
  • @Inian :使用这种方法,您只能找到在某个时间之前修改过的文件。这不是 OP 想要的。
  • @user1934428:是的,同意,但正在寻求他们的澄清,为什么不考虑使用find

标签: linux bash


【解决方案1】:

解析lsis not a good idea的输出。使用 GNU coreutils 和 findutils 软件包中的工具,可以编写一个完成此任务的故障安全程序,如下所示。

n=2 # except the last two
find -maxdepth 1 -type f -name 'foo*' \
     -printf '%T@\t%p\0'              \
| sort  -z -k 1n,1                    \
| head  -z -n -$n                     \
| cut   -z -f 2-                      \
| xargs -0 rm

【讨论】:

  • 太棒了!使用\0-z 是最安全的方法
【解决方案2】:

这是stat的工作

stat -c '%Y %n' foo* | sort -n | head -n -2 | cut -d " " -f 2- | xargs echo rm
rm foo_1 foo_2 foo_3

如果选择了要删除的正确文件,请删除“echo”。

【讨论】:

    【解决方案3】:

    仅通过一个进程使用glob()(处理带有换行符或空格的文件):

    perl -e '
        my @files = sort { -M $a <=> -M $b } grep -f, <./foo*>;
        unlink @files[2..$#files]
    '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-25
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多