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

gar*_*ion 41 linux unix shell

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

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

find . -name test -print
Run Code Online (Sandbox Code Playgroud)

现在,如何删除目录?


请注意,我在目录中也有文件,它们也必须被删除。

Arn*_*anc 87

xargs 做所有的魔法:

find . -name test -type d -print0|xargs -0 rm -r --
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

这是rm一次调用多个目录,避免rm为每个目录单独调用的开销。


作为替代方案,find还可以为每个选定的文件运行一个命令:

find . -name test -type d -exec rm -r {} \;
Run Code Online (Sandbox Code Playgroud)

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

find . -name test -type d -exec rm -r {} +
Run Code Online (Sandbox Code Playgroud)

(注意+最后的;这个相当于xargs解决方案。)


jay*_*ngh 25

find /path/to/dir -name "test" -type d -delete
Run Code Online (Sandbox Code Playgroud)
  • -name:查找传递的名称。您可以-regex用于提供基于正则表达式的名称

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

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

或者:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

正如JF Sebastian在评论中所说:

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

  • 您可以使用 `+` 而不是 `\;` 一次传递多个目录。 (3认同)
  • 抱歉,我忘记提到这些目录可能有文件。由于“查找:无法删除`./start':目录不为空”错误,我无法删除其中一些 (2认同)

maa*_*zza 8

另一种方法是

find . -name test -exec rm -R "{}" \;
Run Code Online (Sandbox Code Playgroud)

关于查找的有用链接:http : //www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml


小智 5

您还可以使用 -exec 选项

find . -name test -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)