删除服务器上的文件

删除服务器上的文件

我的文件夹中有一些文件,例如: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,1cut -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给删除文件,如第一个示例中所示。

相关内容