Linux 为什么要找到';s-exec选项包括';非匹配';项目?

Linux 为什么要找到';s-exec选项包括';非匹配';项目?,linux,bash,grep,find,Linux,Bash,Grep,Find,我正在尝试使用find来查找和排除/过滤少数目录,使其不被复制到另一个备份目录。 我尝试使用find的'-exec'选项复制每个已处理的文件,而不是只复制匹配的文件,因此我对预期的行为应该是什么感到非常困惑,希望能够帮助更好地理解 起点: me@computer>ls AddMonitorsOnEntry MantisCoreFormatting MantisGraph PastePicture XmlImportExport 确保“查找”按预期排除不需要的“文件” me@com

我正在尝试使用find来查找和排除/过滤少数目录,使其不被复制到另一个备份目录。 我尝试使用find的'-exec'选项复制每个已处理的文件,而不是只复制匹配的文件,因此我对预期的行为应该是什么感到非常困惑,希望能够帮助更好地理解

起点:

me@computer>ls
AddMonitorsOnEntry  MantisCoreFormatting  MantisGraph  PastePicture  XmlImportExport
确保“查找”按预期排除不需要的“文件”

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

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

我知道还有其他方法可以完成这项任务,但是“-exec”对于这里的海报来说似乎已经足够好了。我正在寻找帮助,了解如何使用“-exec”而不是使用xargs或其他东西。谢谢

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

你没有2根火柴。您的命令显示3:

  • /AddMonitorsOnEntry
  • /PastePicture
  • 是当前目录,因此您的
    cp
    命令会复制所有内容

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

    我真傻

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

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

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

    用于编程问题,而不是有关使用或配置Unix及其实用程序的问题。或者更适合问这样的问题。嗯…'今天很晚了,哈哈。感谢您的澄清和提示!从
    cp-dr
    中删除
    -r
    也可能有帮助,或者将
    -type f
    添加到
    查找
    条件中。