尝试删除子目录中除最近的2个文件以外的所有文件

gaz*_*i86 3 linux bash ubuntu-12.04

我正在创建一个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
Run Code Online (Sandbox Code Playgroud)

我还试图创建一个文件数组,目的是通过总减2,但数组没有填充所有文件:

while read -rd ''; do      x+=("${REPLY#* }");  done < <(find . -maxdepth 2 -printf '%T@ %p\0' | sort -r -z -n )
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解释一下他们是怎么做的吗?

rzy*_*mek 12

这列出了除最近的两个文件之外的所有文件:

find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -2 
Run Code Online (Sandbox Code Playgroud)

说明:

  • -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
Run Code Online (Sandbox Code Playgroud)