删除除最新目录之外的所有目录

删除除最新目录之外的所有目录

我想编写一个脚本,删除目录中的所有目录(非空目录),但保留最新的目录。这可能吗?如何实现?

答案1

以下是使用 来实现此目的的一种方法find

find -type d ! -wholename $(find -type d -printf '%T+ %p\n' | sort -r | head -1 | cut -d" " -f2) ! -wholename "." -exec rm -r {} +

命令分解:

  • find -type d第一部分告诉 find 仅搜索目录
  • ! -wholename排除具有以下完整名称的匹配项。以下部分(介于 之间$())将被评估并用作文件名
    • $(find -type d -printf '%T+ %p\n' |打印目录的时间戳
    • sort -r |从最新到最旧排序
    • head -1 |只取第一行(最新目录)
    • cut -d" " -f2)从输出中删除时间戳
  • ! -wholename "."排除具有完整名称的匹配项.。您无法删除当前正在工作的目录。
  • -exec rm -r {} +删除匹配的文件。

您应该首先运行不带最后部分()的命令-exec rm -r {} +,以查看将删除哪些目录。


例子:

目录内容:

Aug  4 14:38 bar/
Aug  4 14:38 bla
Aug  4 14:38 foo/
Aug  4 14:41 foobar/

运行命令:

find -type d ! -wholename $(find -type d -printf '%T+ %p\n' | sort -r | head -1 | cut -d" " -f2) ! -wholename "." -exec rm -r {} +

生成的目录内容:

Aug  4 14:38 bla
Aug  4 14:41 foobar/

请注意,这bla是一个文件,而不是目录。因此它不会被删除。

答案2

我找到了一个答案,并将其留在这里,它可能对其他用户有用:

cd /path/to
rm -r `ls -t | awk 'NR>1'`

相关内容