![如何仅保留最后 2 个文件夹并删除目录中的所有其他文件夹?](https://linux22.com/image/1540773/%E5%A6%82%E4%BD%95%E4%BB%85%E4%BF%9D%E7%95%99%E6%9C%80%E5%90%8E%202%20%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E5%B9%B6%E5%88%A0%E9%99%A4%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%9F.png)
我有一个包含几个类似文件夹的目录:
/
20170901150843
20170902123221
20170903203423
20170904123245
20170905115432
我想删除所有目录并仅保留最后 2 个目录。(最新的 2 个)
我怎样才能做到这一点 ?
答案1
下面的应该可以做到:
ls -Fd DirPath/20*|grep '/$'|head -n -2|while read -r d; do rm -rf "$d"; done
其工作原理如下:-
ls
按名称顺序列出以DirPath
开头的条目20
。- 该
-F
选项使用尾随字符对文件进行分类,用于/
目录。 - 该
-d
选项列出的是目录名称,而不是其内容。 grep
确保排除非目录的文件。head
复制除最后两行之外的所有行。while read -r d
d
依次将变量分配给每个目录。- 对于每个目录都
rm -rf
将其删除。
笔记:-
- 我建议您在测试
echo
之前先放置rm
,以确保删除您想要的目录。 - 如果有其他以 开头的目录,则可能需要详细说明掩码
20
,例如20[1-9][0-9][01][0-9]*
或更详细的内容。 - 您可以使用
xargs rm -rf
循环while
:这在您的例子中会起作用,但是我允许将该技术扩展到更一般的情况,即名称中可能包含嵌入空格的情况。
答案2
试试这个。总是最好能清楚地说明你正在尝试做的事情。
find . -mindepth 1 -maxdepth 1 -type d | \
grep -vE '\./(20170904123245|20170905115432)' | \
xargs rm -rf
答案3
如果这样命名,那么就会有效。
find . -maxdepth 0 -type 'd' | sort -r | tail -n +2 | while read line; do rm -rfv "$line"; done
解释:
- 在当前工作目录中查找目录
- 按相反的顺序排列他们的名字(对于下一步很重要)
- 将除前两行之外的所有内容读到输出
- 删除(递归、强制、详细地)名称与每行输入匹配的条目(在本例中为目录)
答案4
我将把该 1 列目录名称列表生成到名为 bb.out 的文件中。编辑该文件并删除您想要保留的 2 个目录。确保删除这两个目录。然后创建并编辑一个新文件,比如 aa.out。在 aa.out 中放入多行仅包含 rm -f 的行您可以通过键入 5 行 rm -rf 然后使用复制一次并多次粘贴来快速轻松地完成此操作,以使 aa.out 具有与 bb.out 一样多或更多的行。现在只需键入paste aa.out bb.out > cc.out
现在只需 source cc.out 它将删除您的所有文件。cc.out 将只包含 n 行rm -rf filename
。