如何在Linux或类似Unix的系统上递归查找和删除目录

时间:2020-01-09 14:17:08  来源:igfitidea点击:

在执行find . -type d -iname foo -delete命令来查找所有foo目录并删除它们。
报错: find: cannot delete './hourly.4/data/foo': Directory not empty

如何在Linux或类似Unix的系统上基于find命令输出递归查找和删除目录?
如果目录为空,则-delete选项删除目录。
您需要使用-exec选项来删除所有目录及其内容。

以递归方式删除目录的find命令语法

尝试执行find命令:

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

另一个选择如下,以递归方式删除Linux或Unix上的文件夹:

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

警告:与find一起使用时,请小心使用rm命令。
您可能最终会删除不需要的数据。

当查找文件或目录时,查找将执行给定命令。
例如:

find . -type d -name "foo" -exec rm -rf {} +

或者

find . -type d -name "bar" -exec rm -rf "{}" \;

输出示例:

removed './daily.0/bar/.cache/motd.legal-displayed'
removed directory './daily.0/bar/root/.cache'
removed './daily.0/bar/.lesshst'
removed './daily.0/bar/.viminfo'
removed './daily.0/bar/.vim/.netrwhist'
removed directory './daily.0/bar/root/.vim'
removed './daily.0/bar/root/.bashrc'
removed './daily.0/bar/.ssh/authorized_keys'
removed directory './daily.0/bar/root'
removed directory './daily.0/bar/var/spool/cron/crontabs'

您可以在工作目录/backups /中找到至少四个深度的目录:

find /backups/ -type d -name "bar" -depth +4 -print0 -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 "{}"

第二个命令是安全版本。
它也很快,并且处理带有空格和特殊字符的怪异目录名称:

  • foo bar
  • Foo _ *bar
  • | Foo _ *bar |!

因此,我希望读者使用以下语法:

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

查找命令的选项其中:

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

xargs命令的选项是:

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