删除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@ %pwhile 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中