查找并删除Linux中所有名为“ test”的目录


35

我有许多名为“ test”的目录,我想删除它们。

我知道如何找到它们并使用以下命令打印它们:

find . -name test -print

现在,如何删除目录?


请注意,我的目录中也有文件,因此也必须将其删除。

Answers:


70

xargs 做所有的魔术:

find . -name test -type d -print0|xargs -0 rm -r --

xargs 执行作为参数传递的命令,并将参数传递给stdin。

rm -r用于删除目录及其所有子目录。

--表示的参数的结尾,以避免开始的路径-从被处理作为一个参数。

-print0告诉find打印\0字符而不是换行符;并-0告知xargs仅将其\0视为参数分隔符。

这一次可以调用rm多个目录,避免了rm为每个目录分别调用的开销。


或者,find也可以为每个选定的文件运行命令:

find . -name test -type d -exec rm -r {} \;

而这其中,具有更好的性能,因为它会调用rm一次多个目录

find . -name test -type d -exec rm -r {} +

(请注意+最后的“;”等效于xargs解决方案。)


1
很好的答案,尤其是+在查找中。我不知道,绝对希望我早就知道。
Scott

注意最后一条命令,它以某种方式删除了一些文件。该xargs命令运行良好。
Henrique de Sousa

23
find /path/to/dir -name "test" -type d -delete
  • -name:查找传递的名称。您可以-regex根据正则表达式提供名称

  • -type:查找文件类型。d只寻找目录

  • -delete:删除找到的列表的动作。

或者:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

正如塞巴斯蒂安JF Sebastian)在评论中指出的那样:

您可以使用+\;不是一次传递多个目录。


1
抱歉,我忘了提到这些目录中可能包含文件。由于“查找:无法删除`./start':目录不为空”错误,我无法删除其中一些错误
垃圾回收

@garbagecollection我添加了一个更新。
jaypal singh

3
您可以使用+\;不是一次传递多个目录。
jfs

谢谢@JFSebastian好点。我将其添加到答案中。
2013年


5

您还可以使用-exec选项

find . -name test -exec rm {} \;

3

假设bash 4+

shopt -s globstar
rm -r ./**/test/

斜杠表示仅匹配目录。预先进行测试:

printf '%s\n' ./**/test/

2

假设您正在使用gnu find,则可以使用-delete选项:

find . -name test -delete

这更容易记住。


2

另一个答案指出,您可以尝试查找所有名称相同的目录并将其test删除

find -name "test" -type d -delete

我在Mac上遇到了一些与交叉兼容性有关的问题,因此我使用了以下等效命令:

find -path "*/test" -type d -delete
  • -path:在完全限定的文件名中查找模式。

但是,在任何一种情况下,如果任何目录中test都包含文件,find将会抱怨Directory is not empty,并且将无法删除该目录。

如果您打算删除包括test目录在内的所有文件,那么我们可以使用相同的技巧来删除名为testfirst 的目录内的所有文件。

find -path "*/test/*" -delete

模式:"*/test/*"将确保我们仅删除名为的目录中的文件/test/。一旦目录为空,我们就可以使用第一个命令删除目录:

find -path "*/test" -type d -delete

例:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.