使用find命令删除子目录指定文件并需确认的问题
问题描述
需要删除/home下多个用户主目录中,所有位于l32子目录内的特定可执行文件fileToDelete,目录结构示例:
/home/usr1/folder/l32/fileToDelete /home/usr1/folder/l32/dontDelete /home/usr2/folderABC/l32/fileToDelete /home/usr2/folderABC/l32/dontDelete /home/usr3/folder/l32/fileToDelete /home/usr3/folder/l32/dontDelete /home/usr10/folderXYZ/whatever/l32/fileToDelete /home/usr10/folderXYZ/whatever/l32/dontDelete
已通过以下命令成功定位目标文件:
find -type d -name "l32" -exec find {} -depth -type f -name fileToDelete -executable \;
但执行删除时遇到问题:
- 使用以下命令报错
rm:cannot remove './home/usr1/folder/l32': Is a directory:find -type d -name "l32*" -exec find {} -depth -type f -name fileToDelete -executable \; -exec rm -i {} \; - 使用
rm -rfi {}会触发无关文件的确认操作,且需确认目录访问; - 尝试xargs同样无效:
find -type d -name "l32*" -exec find {} -depth -type f -name fileToDelete -executable \; | xargs rm -i --
需求:仅删除目标可执行文件,且每个文件删除前需确认。
解决方案
错误原因
外层find匹配的是l32目录,后续-exec rm -i {} \;中的{}指代的是外层找到的目录,而非内层find定位的文件,因此出现删除目录的报错。
方法1:单层find直接定位(推荐)
无需嵌套find,直接通过路径匹配精准定位目标文件:
find /home -type f -path "*/l32/fileToDelete" -executable -exec rm -i {} \;
各参数说明:
/home:指定搜索起始目录,避免搜索当前目录的无关内容-type f:仅查找文件(排除目录)-path "*/l32/fileToDelete":匹配路径中包含/l32/fileToDelete的文件-executable:过滤出可执行文件-exec rm -i {} \;:对每个匹配到的文件,执行带确认的删除操作
方法2:嵌套find修正写法
如果坚持使用嵌套find,需确保rm作用于内层find找到的文件:
find /home -type d -name "l32" -exec find {} -type f -name "fileToDelete" -executable -exec rm -i {} \; \;
内层的-exec rm -i {} \;直接处理内层find输出的文件,外层的\;用于闭合外层find的-exec命令。
方法3:xargs安全写法
若要用xargs,推荐使用-print0和-0处理含特殊字符的文件名:
find /home -type d -name "l32" -exec find {} -type f -name "fileToDelete" -executable -print0 \; | xargs -0 rm -i --
-print0:让find用空字符分隔输出结果,避免文件名含空格时出错xargs -0:读取空字符分隔的输入,对应-print0的输出--:标记参数结束,避免文件名以-开头时被误判为选项
验证步骤
执行删除前,可先替换rm -i为ls,确认匹配的文件是否正确:
find /home -type f -path "*/l32/fileToDelete" -executable -ls
内容的提问来源于stack exchange,提问作者Alexander Unterrainer-DefconQ
相关产品推荐
相关产品推荐

