如何删除文件夹中除最新文件之外的所有文件?

如何删除文件夹中除最新文件之外的所有文件?

我使用的是CentOS 7。在特定目录中,我想删除除最新文件之外的所有“*.log”文件。我试过这个

[rails@server ~]$ ls -t ~/.forever | tail -n +2 | xargs rm --
rm: cannot remove ‘pids’: No such file or directory
rm: cannot remove ‘5QEM.log’: No such file or directory
rm: cannot remove ‘sock’: No such file or directory
rm: cannot remove ‘8BVT.log’: No such file or directory
rm: cannot remove ‘lf4N.log’: No such file or directory
rm: cannot remove ‘Jf8F.log’: No such file or directory
rm: cannot remove ‘H1UG.log’: No such file or directory
rm: cannot remove ‘sNbx.log’: No such file or directory
rm: cannot remove ‘D30J.log’: No such file or directory
rm: cannot remove ‘_yj1.log’: No such file or directory
rm: cannot remove ‘Tz9c.log’: No such file or directory
rm: cannot remove ‘ur0M.log’: No such file or directory
rm: cannot remove ‘pX6o.log’: No such file or directory
rm: cannot remove ‘8P_i.log’: No such file or directory
rm: cannot remove ‘kBX_.log’: No such file or directory
rm: cannot remove ‘n4Ot.log’: No such file or directory
rm: cannot remove ‘VVdY.log’: No such file or directory
rm: cannot remove ‘T1QJ.log’: No such file or directory
rm: cannot remove ‘Zdeo.log’: No such file or directory
rm: cannot remove ‘5ejy.log’: No such file or directory
rm: cannot remove ‘dQEL.log’: No such file or directory

不太确定输出的含义,但结果是没有任何内容被删除。我只对删除直接子文件(而不是子文件夹中的文件)感兴趣。

答案1

使用查找:

这将删除当前目录中除最新文件和文件夹之外的所有文件和文件夹,它仅在直接文件夹中检查最新文件,而不是按照您的要求在子目录中检查最新文件。

find . -maxdepth 1 ! -path .  ! -wholename `find . -maxdepth 1  -printf '%T+ %p\n' | sort -n | tail -1 | cut -d " " -f2` -exec rm -rf {} \;

要仅删除文件而不删除文件夹,请使用-type f

find . -maxdepth 1 -type f  ! -path .  ! -wholename `find . -maxdepth 1  -printf '%T+ %p\n' | sort -n | tail -1 | cut -d " " -f2`  -exec rm -rf {} \;

例子 :

$ touch {1..100}
$ echo "hello" > 89
$ find . -maxdepth 1 -type f  ! -path .  ! -wholename `find . -maxdepth 1  -printf '%T+ %p\n' | sort -n | tail -1 | cut -d " " -f2`  -exec rm -rf {} \;
$ ls
89

答案2

使用 zsh:

zsh -c 'rm ~/.forever/*.log(.om[2,-1])'

拆开包装:

  • 使用基线 glob~/.forever/*.log
  • 仅选择常规文件 ( .)
  • o按修改时间对它们进行 rder(排序)m(这会将最新文件放在旧文件之前)
  • 2从该有序列表中选择到最后一个 ( )的范围-1——这会遗漏元素 #1,即最新文件
  • 然后变成传递给的文件列表rm

参考:

答案3

您将列出目录中的名称.forever,但执行rm上一级的命令。希望您那里没有同名的重要文件。

如果要将其放入脚本中,最简单的方法可能是直接cd放入要删除文件的目录中,但在 xargs 调用中添加目录名称也是一种选择。

当然,关于不使用 的输出的警告注释ls是有效的,但根据您的情况的文件名,您可能会逃脱它。

相关内容