如何用Linux命令保留目录下最新的5个REF开头文件?
保留目录中最新5个REF开头文件的Linux命令
需求:编写一条Linux命令,仅保留目录中最新的5个以REF开头的文件,删除其余以REF开头的文件,且不改动其他文件。
示例目录文件列表:
-rw-r--r-- 1 0 Jan 1, 2022 File_0 -rw-r--r-- 1 0 Jan 1, 2022 REF_1 -rw-r--r-- 1 0 Feb 1 2022 REF_2 -rw-r--r-- 1 0 March 1, 2022 REF_3 -rw-r--r-- 1 0 Apr 1, 2022 REF_4 -rw-r--r-- 1 0 May 1, 2022 REF_5 -rw-r--r-- 1 0 June 1, 2022 REF_6 -rw-r--r-- 1 0 Jul 1, 2022 file_7 -rw-r--r-- 1 0 1 Aug 2022 file_8 -rw-r--r-- 1 0 Sep 1, 2022 REF_9
执行命令后应仅删除以下文件:
-rw-r--r-- 1 0 Jan 1, 2022 REF_1 -rw-r--r-- 1 0 Feb 1 2022 REF_2
你之前命令的问题
你尝试的ls -t REF* | head -n+4 | xargs rm REF*存在两处关键错误:
- 参数写法错误:
head -n+4无法正确筛选目标文件,应该用tail -n +6排除前5个最新文件 - 逻辑错误:最后
xargs rm REF*直接将所有REF开头文件传给rm,完全忽略了管道筛选结果,导致所有REF文件被误删
正确的命令
基础版本(文件名无特殊字符时适用)
ls -t REF* | tail -n +6 | xargs rm -f
命令解释:
ls -t REF*:按修改时间从新到旧列出所有REF开头的文件(最新文件排在最前)tail -n +6:从第6行开始输出,即排除前5个最新文件,剩下的就是待删除的文件xargs rm -f:将筛选出的文件名传给rm执行删除,-f避免因文件不存在报错
安全版本(兼容含空格/特殊字符的文件名)
如果文件名可能包含空格或特殊符号,建议用find命令更稳妥:
find . -maxdepth 1 -type f -name "REF*" -printf "%T@ %p\n" | sort -rn | tail -n +6 | awk '{print $2}' | xargs rm -f
命令解释:
find . -maxdepth 1 -type f -name "REF*":仅在当前目录查找所有REF开头的普通文件-printf "%T@ %p\n":输出文件的修改时间戳(精确到秒)和完整路径sort -rn:按时间戳从大到小排序(最新文件在前)tail -n +6:排除前5个最新文件,筛选出待删除的文件awk '{print $2}':提取文件路径部分xargs rm -f:执行删除操作
内容的提问来源于stack exchange,提问作者Mohammed Ajeddig
相关产品推荐
相关产品推荐

