gpt4 book ai didi

linux - 删除所有具有公共(public)前缀的文件,N个最新修改的除外

转载 作者:行者123 更新时间:2023-12-03 09:48:05 24 4
gpt4 key购买 nike

我正在尝试创建一个 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 的输出is 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

关于linux - 删除所有具有公共(public)前缀的文件,N个最新修改的除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62758208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com