除了最新修改的N个文件以外,删除所有具有相同前缀的文件。

3
我尝试创建一个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*文件,但保留最近的两个。这将导致目录:
-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

目前我只能删除除最近的两个文件以外的所有文件,这将影响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* - MichalH
为什么不能使用 find 呢?如果你想查找修改时间,可以查找 -mtime 属性;如果只想查找访问时间,则只需查找 -atime - Inian
@Inian:使用这种方法,您只能找到在一定时间前修改过的文件。这不是OP要寻找的内容。 - user1934428
@user1934428:是的,同意,但我想向他们澄清一下,为什么没有考虑使用 find - Inian
3个回答

9
解析 ls 命令的输出不是个好主意。使用 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

1
太好了!使用\0-z是最安全的方式。 - glenn jackman

1

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

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

1
这是一个针对 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”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接