删除bash中除最新X文件以外的所有文件

时间:2020-03-05 18:42:45  来源:igfitidea点击:

在带有bash的标准UNIX环境中,是否有一种简单的方法来运行命令以从目录中删除除最近的X文件以外的所有文件?

再举一个具体的例子,想象一下某些cron作业每小时将一个文件(例如,日志文件或者已压缩的备份)写到目录中。我想要一种方法来运行另一个cron作业,该作业将删除该目录中最旧的文件,直到少于5个文件为止。

需要明确的是,只有一个文件存在,永远不要删除它。

解决方案

回答

删除目录中除5(或者任意数量)的最新文件外的所有文件。

rm `ls -t | awk 'NR>5'`

回答

(ls -t|head -n 5;ls)|sort|uniq -u|xargs rm

此版本支持带空格的名称:

(ls -t|head -n 5;ls)|sort|uniq -u|sed -e 's,.*,"&",g'|xargs rm

回答

如果文件名没有空格,则可以使用:

ls -C1 -t| awk 'NR>5'|xargs rm

如果文件名中确实有空格,则类似

ls -C1 -t | awk 'NR>5' | sed -e "s/^/rm '/" -e "s/$/'/" | sh

基本逻辑:

  • 按时间顺序获得文件列表,一列
  • 得到除前5个以外的所有字符(此示例为n = 5)
  • 第一版:将其发送给rm
  • 第二个版本:生成脚本,将其正确删除

回答

当前目录中有目录时,所有这些答案均失败。这是可行的:

find . -maxdepth 1 -type f | xargs -x ls -t | awk 'NR>5' | xargs -L1 rm

这:

  • 当前目录中有目录时有效
  • 尝试删除每个文件,即使无法删除前一个文件(由于权限等)
  • 当当前目录中的文件数量过多并且xargs通常会使我们烦恼时(-x),安全失败
  • 不能满足文件名中的空格(也许我们使用的是错误的OS?)

回答

find . -maxdepth 1 -type f -printf '%T@ %p
while IFS= read -rd ''; do 
    x+=("${REPLY#* }"); 
done < <(find . -maxdepth 1 -printf '%T@ %p##代码##' | sort -r -z -n )
' | sort -r -z -n | awk 'BEGIN { RS="##代码##"; ORS="##代码##"; FS="" } NR > 5 { sub("^[0-9]*(.[0-9]*)? ", ""); print }' | xargs -0 rm -f

对于-printf需要GNU查找,对于-z需要GNU排序,对于" \ 0"需要GNU awk,对于-0需要GNU xargs,但是需要处理带有嵌入式换行符或者空格的文件。

回答

忽略换行符是在忽略安全性和良好的编码。唯一的好答案就是噪音。这是他的一个变体,它将文件名放在数组$ x中

##代码##

回答

在Debian上运行(假设我在其他发行版上也是如此:
rm:无法删除目录" .."

真烦人..

无论如何,我对上面的内容进行了调整,并在命令中添加了grep。就我而言,我在一个目录中有6个备份文件,例如file1.tar file2.tar file3.tar等,我只想删除最旧的文件(在我的情况下,删除第一个文件)

我运行的用于删除最旧文件的脚本是:

ls -C1 -t | grep文件| awk'NR> 5'| xargs rm

这(如上所述)删除了我的第一个文件,例如file1.tar这也将留在file2 file3 file4 file5和file6中