【问题标题】:Why find's -exec option is including 'non-matched' items?为什么 find 的 -exec 选项包含“不匹配”项目?
【发布时间】:2020-01-28 21:26:21
【问题描述】:

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

起点:

me@computer>ls
AddMonitorsOnEntry  MantisCoreFormatting  MantisGraph  PastePicture  XmlImportExport

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

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

现在将那些 2 目录复制到备份目录:

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

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

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

【问题讨论】:

标签: linux bash grep find


【解决方案1】:

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

您没有 2 个匹配项。您的命令显示 3:

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

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

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

【讨论】:

  • 嗯...今天很晚了哈哈。感谢您的澄清和提示!
  • cp -dr 中删除-r 也可能有帮助,或者将-type f 添加到find 条件中。
【解决方案2】:

我真傻。。

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

为了解决这个问题,我在排除的目录中添加了当前目录。

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

【讨论】:

    猜你喜欢
    • 2012-08-03
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多