首页 > 解决方案 > 为什么 find 的 -exec 选项包含“不匹配”项目?

问题描述

我正在尝试使用 find 来查找和排除/过滤一些目录,以免被复制到另一个备份目录。我尝试使用 find 的 '-exec' 选项这样做最终会复制每个已处理的文件而不是仅复制匹配项,因此我对预期的行为应该是什么感到非常困惑,并且希望能帮助获得更好的理解。

初始点:

me@computer>ls
AddMonitorsOnEntry  MantisCoreFormatting  MantisGraph  PastePicture  XmlImportExport

确保 find 按预期排除了不需要的“文件”

me@computer>find . -maxdepth 1 -not -regex '.*MantisCoreFormatting\|.*MantisGraph\|.*XmlImportExport'
.
./AddMonitorsOnEntry
./PastePicture

现在将这两个目录复制到备份目录:

me@computer>find . -maxdepth 1 -not -regex '.*MantisCoreFormatting\|.*MantisGraph\|.*XmlImportExport' -exec cp -dr '{}' ~/backup \;

现在看看它是否有效......

me@computer>cd ~/backup
me@computer>ls
AddMonitorsOnEntry  backup  MantisCoreFormatting  MantisGraph  PastePicture  XmlImportExport

有吗??我认为'-exec'只对匹配项进行操作,根据手册页中的这个片段:“......指定的命令对每个匹配的文件运行一次......”

我知道还有其他方法可以完成这项任务,但“-exec”对于这里的海报来说似乎足够好https://unix.stackexchange.com/questions/50612/how-to-combine-2-name-conditions -in-find/50633。我正在寻求帮助以了解如何使用“-exec”而不是使用 xargs 或其他东西。谢谢。

标签: linuxbashgrepfind

解决方案


现在将这两个目录复制到备份目录

你没有 2 场比赛。您的命令显示 3:

  1. .
  2. ./AddMonitorsOnEntry
  3. ./PastePicture

.是当前目录,因此您的cp命令会复制所有内容。

而不是find .您可以使用find *跳过当前目录.,但仍处理其中的所有(非隐藏)文件/目录。


推荐阅读