我的文件夹中有一些文件,例如:1244、1244.backup、1264、1264.backup、1346、1346.backup……提取新版本后会自动从服务器下载新文件对。如何删除所有文件,而不删除最近下载日期/时间的最后 2 个文件?
答案1
如果您可以 100% 确定您的文件名不包含空格或其他空白,您可以采取简单、脆弱且糟糕的方法:
ls -t | tail -n+3 | xargs rm
-t
告诉ls
按时间排序,tail -n+3
意思是“从第二行输入后开始打印”,因此它将打印除最后两个文件之外的所有内容。最后,将这些传递给以xargs rm
删除它们。
一种更好、更安全、更强大的适用于任意文件名的方法是这样的:
stat --printf '%Y %n\0' * | sort -zrnk1,1 | cut -zd' ' -f 2- | tail -zn+3 | xargs -0 rm
将stat --printf '%Y %n\0' *
打印当前目录中每个文件(或目录)的修改日期(以纪元以来的秒数为单位)以及文件名,每行以 NUL 字节(\0
)而不是换行符结尾。这样,我们甚至可以处理名称中带有换行符的文件名。
接下来,根据第一个字段 ( ) ,以反向 ( ) 数字 ( ) 顺序sort -zrnk1,1
对以 NUL 结尾的 ( ) 输入进行排序。这将传递以删除第一个空格分隔的字段,从而删除时间戳。为了说明:-z
-r
-n
-k1,1
cut -zd' ' -f 2-
$ ls -l *
-rw-r--r-- 1 terdon terdon 0 Oct 11 15:00 'a bad file name'
-rw-r--r-- 1 terdon terdon 0 Oct 11 15:00 'another'$'\n''bad file name'
-rw-r--r-- 1 terdon terdon 0 Oct 12 15:00 file.1
-rw-r--r-- 1 terdon terdon 0 Oct 12 15:00 file.2
-rw-r--r-- 1 terdon terdon 0 Oct 12 15:00 file.3
-rw-r--r-- 1 terdon terdon 0 Oct 12 15:00 file.4
-rw-r--r-- 1 terdon terdon 0 Oct 12 15:00 file.5
现在,运行上述命令得到以下结果:
$ stat --printf '%Y %n\0' *
1665489608 a bad file name1665489610 another
bad file name1665576030 file.11665576031 file.21665576032 file.31665576033 file.41665576034 file.5
$ stat --printf '%Y %n\0' * | sort -zrnk1,1
1665576034 file.51665576033 file.41665576032 file.31665576031 file.21665576030 file.11665489610 another
bad file name1665489608 a bad file name
$ stat --printf '%Y %n\0' * | sort -zrnk1,1 | cut -zd' ' -f 2-
file.5file.4file.3file.2file.1another
bad file namea bad file name
所有这些最终都会传递tail -zn+3 | xargs -0 rm
给删除文件,如第一个示例中所示。