删除父目录中除一个目录及其后代目录之外的所有目录

删除父目录中除一个目录及其后代目录之外的所有目录

目录结构

我想删除目录 B 和 D。但我想保留 C 及其所有子文件和目录。删除父目录的所有子目录(只保留一个目录及其子目录)的命令是什么?

非常感谢您的帮助。

答案1

使用 bash shell 的扩展的 glob功能(在当前 Ubuntu 安装中默认启用),

$ tree A
A
├── B
├── C
│   ├── ac1
│   └── ac2
└── D

5 directories, 0 files

您可以C使用 glob 表达式来处理除其内容之外的所有内容A/!(C),即

$ echo A/!(C)
A/B A/D

因此消除除了目录C及其内容之外的所有内容你都可以简单地使用

rm -rf A/!(C)

离开

$ tree A
A
└── C
    ├── ac1
    └── ac2

3 directories, 0 files

答案2

你想要的是这个命令:

find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;

演示:

# List what's inside directory we want to remove
$ ls
file1  file2  keepMe/  removeA/  removeB/
# Testing what find gives without removing
$ find ~/TESTDIR -mindepth 1 -type d -not \( -name "keepMe" \)               
/home/xieerqi/TESTDIR/removeA
/home/xieerqi/TESTDIR/removeB
# Actual removal and testls
$ find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
$ ls
file1  file2  keepMe/

解释:

  • find DIRECTORY调用find命令对DIRECTORY进行操作
  • -mindepth 1:仅处理目录的内容,避免使用级别 0 的目录本身
  • -maxdepth 1:防止进入子目录(rm -rf无论如何都是递归的,所以我们不需要进入子目录来删除它们)
  • -type d:仅搜索目录
  • -not \( -name "keepMe" \)忽略您想保留的名称的项目
  • -exec rm -rf {} \;对每个找到的项目执行删除

答案3

一个简单的方法是使用 trash-cli

你可以使用以下命令安装sudo apt-get install trash-cli

安装后,您可以导航到父目录 A,cd /A然后发出命令 trash B D,其中 B 和 D 是您要删除的目录(它们最终会被放入所在驱动器的垃圾箱中,因此如果您犯了错误,您可以恢复文件)

在 Ubuntu 16.04 和 14.04 下测试

答案4

只需使用 Bash 的for循环和test过滤所需的目录以及rm -rf递归删除目录的命令,如下所示:

for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done

这将迭代内部的所有元素(文件和目录),/path/to/parent/如果其名称不等于,则递归删除该元素dir_survive。如果父目录是当前目录,则只能写*为路径。

如果您不确定并且想要测试哪些元素会首先被删除而不采取任何操作,只需将rm -rf上面命令中的替换为echo,它只会输出删除候选项。

以下是一个运行示例:

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
├── dir2
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

9 directories, 12 files

$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done

$ tree
.
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

3 directories, 4 files

相关内容