![如何根据“find”输出删除目录:仅第一个结果](https://linux22.com/image/146725/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E2%80%9Cfind%E2%80%9D%E8%BE%93%E5%87%BA%E5%88%A0%E9%99%A4%E7%9B%AE%E5%BD%95%EF%BC%9A%E4%BB%85%E7%AC%AC%E4%B8%80%E4%B8%AA%E7%BB%93%E6%9E%9C.png)
基于这个问题,
我尝试仅删除结果的第一个文件夹:
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
该循环假设它在bash
shell 中运行,迭代所有匹配的名称*
(包括隐藏名称)。循环体测试当前名称是否是目录(不是目录的符号链接),如果是,则在退出循环之前递归删除该目录。
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 {} ;