这是我的问题,
我有一个文件夹,其中存储了具有特定格式的多个文件:
文件名称.类型MM-DD-YYYY-HH:MM
其中 MM-DD-YYYY-HH:MM 是其创建时间。当然,可能有多个同名文件,但时间不同。
我想要的是一个可以保留每个文件的 3 个最新版本的脚本。
所以,我在那里找到了一个例子:使用 shell 删除最旧的文件
但我不想删除大量文件,而是保留一定数量的较新文件。有没有办法获取 find 命令,解析 Name_of_file 并保持 3 个最新???
这是我已经尝试过的代码,但它并不完全是我需要的。
find /the/folder -type f -name 'Name_of_file.Type*' -mtime +3 -delete
感谢帮助!
所以我决定添加我的最终解决方案,以防有人喜欢得到它。它是给出的 2 个解决方案的组合。
ls -r | grep -P "(.+)\d{4}-\d{2}-\d{2}-\d{2}:\d{2}" | awk 'NR > 3' | xargs rm
一条线,超级高效。如果日期或名称模式发生任何变化,只需更改 grep -P 模式以匹配它。这样您就可以确保只有符合此模式的文件才会被删除。
您能否额外确保文件上的时间戳与文件名上的时间戳完全相同?如果他们有点不对劲,你会在意吗?
The ls
命令可以按时间戳顺序对文件进行排序。你可以做某物像这样:
$ ls -t | awk 'NR > 3' | xargs rm
- THe
ls -t
按修改时间列出文件,最新的排在最前面。
- `awk 'NR > 3' 打印出文件列表除了前三行这是最新的三个。
- The
xargs rm
将删除早于前三个的文件。
现在,这不是确切的解决方案。可能存在以下问题xargs
因为文件名可能包含奇怪的字符或空格。如果你能保证不是这样的话,应该没问题。
另外,您可能想按名称对文件进行分组,并保留最后三个。唔...
ls | sed 's/MM-DD-YYYY-HH:MM*$//' | sort -u | while read file
do
ls -t $file* | awk 'NR > 3' | xargs rm
done
ls 将列出目录中的所有文件。这sed 's/\MM-DD-YYYY-HH:MM//' will remove the date time stamp from the files. The
sort -u` 将确保您只有唯一的文件名。因此
file1.txt-01-12-1950
file2.txt-02-12-1978
file2.txt-03-12-1991
将减少为:
file1.txt
file2.txt
这些是通过循环放置的,并且ls $file*
将列出以文件名和后缀开头的所有文件,但会将其通过管道传输到awk
这将删除最新的三个,并将其传送到xargs rm
这将删除除最新的三个之外的所有内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)