好的,您的脚本有几个问题。
首先,最严重的问题是这一行:
ls -t /var/path/to/folder |head -n 3;
ls -t | head -n 3
命令会返回按文件最后修改时间排序的文件列表,以最近修改的文件为开头。
head -n 3
表示只列出前三行。因此它的作用是“给我一个仅包含最近修改的三个文件的列表”,这不是你想要的。
我不确定你在第二个 ls
命令中要做什么,但我很确定那只会将目录中所有文件连接到你的列表中。这意味着当它被 sort
和 uniq
处理时,你将只得到该目录中所有文件的字母顺序列表。当传递到像 xargs rm
这样的命令时,你将删除该目录中所有内容。
接下来,sort | uniq
不需要 uniq
部分。你可以直接在 sort
上使用 -u
开关来去除重复项。你根本不需要这一部分。
最后,进行目录删除的操作。对于这一点,在你的问题中已经说得很清楚了:只需使用 rm -r
。
以下是我能想到的最简单的方法:
ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r
这里发生的情况如下:
ls -t1
打印出/var/path/to/folder
中所有文件/目录的列表,每行一个,按最近修改日期排序。
tail -n +4
打印ls -t1
输出的第四行及以后的所有行(即不会列出最近修改的三个文件)。
xargs rm -r
告诉计算机删除从tail
输出的任何文件。-r
表示递归删除文件,所以如果遇到一个目录,它将删除该目录中的所有内容,然后删除目录本身。
请注意,我没有对任何内容进行排序或删除重复项。因为:
ls
仅报告一次文件,因此没有重复项需要删除
- 无论以什么顺序删除文件,您都会删除传递的每个文件,所以顺序并不重要。
这些解释是否清楚易懂?
编辑:
由于我错误地认为在传递绝对目录时ls
会指定完整路径,而且您可能无法执行cd
命令,因此您可以使用tail
命令。
例如:
ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r
cd
到/var/path/to/folder
,运行我给你的代码,然后使用该变量cd
回原始路径。这是我能做的最好的事情了,抱歉。 - AgentConundrum