为什么查找的 -exec 选项包含"不匹配"项?



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

起点:

me@computer>ls
AddMonitorsOnEntry  MantisCoreFormatting  MantisGraph  PastePicture  XmlImportExport

确保查找按预期排除不需要的"文件">

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 或其他东西。谢谢。

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

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

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

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

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

我傻了。

我的初始查找表达式结果包括当前目录,因此当前目录中的任何文件都将由"-exec"操作。

为了修复,我在排除的目录中添加了当前的目录。

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

最新更新