我正在创建一个 cron,用于清除除最近的两个文件以外的所有指定文件夹的子目录(仅限第一个子目录),但遇到了问题。
这些是我的尝试:
find ./ -type d -exec rm -f $(ls -1t ./ | tail -n +4);
find . -maxdepth 2 -type f -printf '%T@ %p\0' | sort -r -z -n | awk 'BEGIN { RS="\0"; ORS="\0"; FS="" } NR > 5 { sub("^[0-9]*(.[0-9]*)? ", ""); print }' | xargs -0 rm -f
我还尝试创建一个文件数组,目的是使总数减去 2,但该数组并未填充所有文件:
while read -rd ''; do x+=("${REPLY#* }"); done < <(find . -maxdepth 2 -printf '%T@ %p\0' | sort -r -z -n )
有人可以帮我解释一下他们是怎么做到的吗?
最佳答案
这列出了除了最近的两个文件之外的所有文件:
find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -2
解释:
-type f
仅列出文件-printf '%C@ %P\n'
%T@
显示自 1970 年以来文件的最后修改时间(以秒为单位)。%P
显示文件名
| sort -n
进行数字排序| cut -d' ' -f2-
删除秒表输出,只留下文件名| head -n -2
显示除最后两行以外的所有内容
因此,要删除所有这些文件,只需通过 xargs rm
或 xargs rm -f
添加管道即可:
find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -2 | xargs rm
关于linux - 试图删除子目录中除最近的 2 个文件之外的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16190845/