如何根据“find”输出删除目录:仅第一个结果

如何根据“find”输出删除目录:仅第一个结果

基于这个问题,

如何根据“find”输出删除目录?

我尝试仅删除结果的第一个文件夹:

find * -type d | head -n1 | -exec rm -rf {} \;

但我收到此错误:

bash: -exec: command not found

怎么了?

答案1

您可以-quit在使用-delete或后使用-exec

-辞职
立即退出。不会有子进程继续运行,但不会再处理命令行上指定的路径。


删除命令的第一个结果find

find * -type d -exec rm -Rf {} \; -quit

或者

find . ! -path . -type d -exec rm -Rf {} \; -quit

后者会找到隐藏的文件夹。


请注意,您的查找输出可能不按字母顺序排序

对于排序后删除第一个结果:

find * -maxdepth 1 -type d -print0 | sort -z | head -zn1 | xargs -r0 rm -Rf

对于数字排序,使用sort -zn

答案2

pLumo充分给出了一些很好的替代解决方案在他们的回答中。我提供了一种完全不同的方法。

您会注意到该find命令,即您使用它来*描述顶级搜索路径的方式,仅真正用于*查找扩展为的名称中的第一个目录

您也可以使用 shell 循环来执行此操作,这会使代码更易于阅读并了解其作用:

shopt -s dotglob nullglob

for name in *; do
    if [ -d "$name" ] && [ ! -h "$name" ]; then
        rm -rf -- "$name"
        break
    fi
done

该循环假设它在bashshell 中运行,迭代所有匹配的名称*(包括隐藏名称)。循环体测试当前名称是否是目录(不是目录的符号链接),如果是,则在退出循环之前递归删除该目录。

zsh使用更简单的命令可以在 shell 中产生类似的效果

rm -rf -- *(D/[1])

这将删除扩展到的第一个目录*。通配限定符将(D/[1])的匹配限制*为仅目录 ( /),但包括隐藏名称 ( D),并且仅返回第一个匹配名称 ( [1])。如果当前目录中没有目录,您会从 shell 收到“未找到匹配项”的错误消息。

答案3

这看起来很危险,但你可以尝试:

find * -type d | head -n1 | xargs rm -rf

答案4

对我来说这段代码有效:

  • 仅查找带有 -type f 的文件,
  • 过滤不包含“.gz”的文件
  • 在本例中选择 N 个文件,仅选择第一个 -n 1

代码:

寻找 。 -输入f! -名称“*.gz”|头 -n 1 | xargs rm -rf {} ;

相关内容