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