在Linux/Unix上如何递归查找并删除目录

时间:2019-11-20 08:53:52  来源:igfitidea点击:

使用find . -type d -iname foo -delete删除所有foo目录时,报错

find: cannot delete '/test/foo': Directory not empty

在Linux/Unix系统中,如何使用find命令输出递归查找和删除目录?并且如果目录为空,则删除目录。

查找命令语法以递归方式删除目录

需要使用-exec选项来删除所有目录及其内容。

语法如下:

find /dir/to/search/ -type d -name "dirName" -exec rm -rf {} +

或者以递归方式删除Linux/Unix上的文件夹:

find /dir/to/search/ -type d -name "dirName" -exec rm -rf \;

使用xargs递归查找和删除目录

在Linux/Unix系统上查找和删除目录的语法如下。

例如,删除所有空目录:

find /path/to/dir/ -type d -empty -print0 | xargs -0 -I {} /bin/rm -rf "{}"

示例: 删除/backups/文件夹中的所有foo目录(包括子目录):

find /backups/ -type d -name "foo*" -print0 | xargs -0 -I {} /bin/rm -rf "{}"

这个命令是安全版本特别是处理带有空格和特殊字符的怪异目录名称。
所有建议在find中删除都用这个语法:

find /path/to/search/ -name "pattern" -print0 | xargs -0 -I {} /bin/rm -rf "{}"

其中:

  • -name "pattern":与外壳模式pattern匹配的文件基本名。例如,foo,Foo*3等。
  • -print0:在标准输出上显示完整的文件名,后跟一个空字符。这允许包含换行符或其他类型的空格的文件名可以由处理查找输出的程序正确解释。该选项对应于xargs的--0选项。

xargs命令的选项:

  • -0:find给定的输入项以空字符而不是空格终止,并且引号和反斜杠不是特殊的(每个字符均按字面意义使用)。禁用文件字符串的结尾,该字符串与其他任何参数一样对待。
  • -I {} /bin/rm -rf" {}":运行rm命令, 删除{}传递的文件或目录。