我想编写一个脚本,删除目录中的所有目录(非空目录),但保留最新的目录。这可能吗?如何实现?
答案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'`