![使用 find 查找目录并删除其子目录](https://linux22.com/image/111667/%E4%BD%BF%E7%94%A8%20find%20%E6%9F%A5%E6%89%BE%E7%9B%AE%E5%BD%95%E5%B9%B6%E5%88%A0%E9%99%A4%E5%85%B6%E5%AD%90%E7%9B%AE%E5%BD%95.png)
假设我有一个嵌套目录列表,如下所示:
./x1/mf/dir1
./x1/mf/dir2
./x1/mf/file1
./x2/mf/dir3
./x2/mf/file2
...
我想删除每个mf
目录的所有子目录。意思是,dir1
在前面的例子中。dir2
dir3
我知道
find . -type d -name "mf"
将返回所有名为 的目录的列表mf
。并ls -d */
返回当前目录下的所有子目录。所以我尝试了
find . -type d -name "mf" -exec ls -d /* {} \;
列出所需的目录,但它实际上会打印/
.我打算将结果列表通过管道传送xargs rm -r
到之后进行删除。
答案1
设置测试目录和文件:
$ mkdir -p x{1..3}/mf/dir{1..3}
$ touch x{1..3}/mf/file{1..3}
$ tree
.
|-- x1
| `-- mf
| |-- dir1
| |-- dir2
| |-- dir3
| |-- file1
| |-- file2
| `-- file3
|-- x2
| `-- mf
| |-- dir1
| |-- dir2
| |-- dir3
| |-- file1
| |-- file2
| `-- file3
`-- x3
`-- mf
|-- dir1
|-- dir2
|-- dir3
|-- file1
|-- file2
`-- file3
然后找到其路径中的所有目录mf
并将其删除。它-depth
进行深度优先遍历,因此find
不会尝试进入已删除的目录。我们还打印所有被删除的目录的名称。
$ find . -depth -type d -path "*/mf/*" -print -exec rm -rf {} +
./x1/mf/dir1
./x1/mf/dir2
./x1/mf/dir3
./x2/mf/dir1
./x2/mf/dir2
./x2/mf/dir3
./x3/mf/dir1
./x3/mf/dir2
./x3/mf/dir3
现在:
$ tree
.
|-- x1
| `-- mf
| |-- file1
| |-- file2
| `-- file3
|-- x2
| `-- mf
| |-- file1
| |-- file2
| `-- file3
`-- x3
`-- mf
|-- file1
|-- file2
`-- file3
答案2
我强烈建议在ingls
之前使用它rm -fr
,原因很明显:
find . -type d -name "mf" -print0 | xargs -0 -n1 -I haystack find haystack -type d -exec rm -fr {} \;
例子:
$ tree
.
├── bar
│ ├── foo
│ │ ├── bar
│ │ └── baz
│ └── freeble
├── baz
│ ├── foo
│ │ ├── bar
│ │ └── baz
│ └── freeble
└── quux
├── foo
│ ├── bar
│ └── baz
└── freeble
15 directories, 0 files
$ find . -type d -name "foo" -print0 | xargs -0 -n1 -I haystack find haystack -type d -maxdepth 0 -exec rm -fr {} \;
$ tree
.
├── bar
│ └── freeble
├── baz
│ └── freeble
└── quux
└── freeble
6 directories, 0 files