我正在尝试使用 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:
.
./AddMonitorsOnEntry
./PastePicture
.
是当前目录,因此您的cp
命令会复制所有内容。
您可以使用find *
跳过当前目录.
,但仍然可以处理其中的所有(非隐藏(文件/目录,而不是find .
。
我傻了。
我的初始查找表达式结果包括当前目录,因此当前目录中的任何文件都将由"-exec"操作。
为了修复,我在排除的目录中添加了当前的目录。
me@computer>find . -maxdepth 1 -not -regex '.*MantisCoreFormatting|.*MantisGraph|.*XmlImportExport|.'
./AddMonitorsOnEntry
./PastePicture