在目录中保留固定数量的文件


0

我们有一个Linux目录,每天在其中添加文件和目录。

我们喜欢通过在任何给定时间将列表固定为50个最新的文件和目录来控制目录中的文件和子目录列表。

我们如何编写脚本来实现这一目标?


“将列表固定到最近的50个文件”到底是什么意思?
slhck

您是否要列出最近50个文件?还是删除所有早于此的文件?
ЯрославРахматуллин

嗨ЯрославРахматуллин,slhck,感谢您的回复。我们喜欢保留目录的最近50个子目录。
chz

@chz是否表示要删除除最近创建的50个目录以外的所有目录?
evilsoup

Answers:


0

使用GNU findsort,您可以从当前目录中获取最新的50个文件及其时间戳:

find . -mindepth 1 -maxdepth 1 -printf '%T@ %p\n' | sort -n | tail -n 50

用管道将它们插入while read以获得每个文件名:

find . -mindepth 1 -maxdepth 1 -printf '%T@ %p\n' |
sort -n | tail -n 50 |
while read -r ts file; do echo rm -rf -- "$file"; done

在这里,printf输出可排序的时间戳,数字sort将使用该时间戳。我们获取了最早的50个文件或目录,并分别删除了每个文件或目录。删除echo脚本中的即可实际执行命令。

请注意,如果您的文件/目录名称中包含换行符,则此方法无效。不会经常发生,但要仔细检查。由于的性质read,如果存在前导或尾随空格,它也将不起作用。

有关更多想法,请参见:BashFAQ / 003-如何在目录中找到最新(最新,最早,最旧)文件?


-3

如果只需要查看文件夹中的目录(而不是subdir),则执行脚本:

#!/bin/bash
l=$(ls |wc -l)
n=$[$l-50]
rm -rf `ls -1t|tail -$n`

1
请仔细阅读mywiki.wooledge.org/ParsingLs-ls不应解析输出。这导致文件路径中包含空格的问题。因此,您的脚本不安全。另外,为了将来,请检查我们的格式帮助和缩进代码4个空格。
slhck 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.