如何仅保留最后 2 个文件夹并删除目录中的所有其他文件夹?

如何仅保留最后 2 个文件夹并删除目录中的所有其他文件夹?

我有一个包含几个类似文件夹的目录:

/
   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 dd依次将变量分配给每个目录。
  • 对于每个目录都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

解释:

  1. 在当前工作目录中查找目录
  2. 按相反的顺序排列他们的名字(对于下一步很重要)
  3. 将除前两行之外的所有内容读到输出
  4. 删除(递归、强制、详细地)名称与每行输入匹配的条目(在本例中为目录)

答案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

相关内容