我在这个魔方上花了几天时间。我为解决一个问题所做的任何事情都会破坏另一个问题。
我在兼容 POSIX 的 MacOS X 10.5 到 10.14 上。我在 Perl 脚本的上下文中调用它
system ("find blah blah > FILENAME");
我需要 Unix 'find' 同时做所有这些事情。
- 从卷根开始,例如
/Volumes/My HD
- 不要跨文件系统
- 仅打印文件,而不是目录或符号链接
- 甚至不要进入多个目录,例如
net dev system
. (即不探索/Volumes/foo/dev/,但探索/Volumes/foo/Users/Jim/ dev /github/twonky/) - 起点可能包含空格
现在我正在做以下事情:(为了便于阅读,分成几行;实际上是一长行)
Find -x '/Volumes/foo/'
-path '/Volumes/foo//dev/*' -prune
-path '/Volumes/foo//net/*' -prune
-path '/Volumes/foo//system/*' -prune
-o -type f -print
双 / 的原因是find的打印输出包含 // 因为起点以 / 结尾。修剪路径必须一致,否则它们将不匹配。为什么起点以/结尾?因为如果没有,则find在名称中带有空格的任何起点上都会失败,例如“我的高清”。试过了。
现在, find 仅排除列表中的第一个目录。其余的,它只是忽略。我目前正在 OS X 10.5 上进行测试,但我需要在任何地方都可以使用的东西。
多个修剪 + 仅文件 + 文件名中的空格是否太过分了?我只是要求太多find吗?
您需要一个“或”来完成第二次匹配——没有一条路径可以同时匹配
-path '/Volumes/foo//dev/*'
和-path '/Volumes/foo//net/*'
我的回答是纯 Perl 解决方案。
使用此沙箱:
以下 Perl 代码使用
File::Find
:给出预期(如果我理解正确的话):
它是一个 POC,它可以被增强。
另请注意,您拥有
find2perl
记录在案的工具,该工具能够使用相同的标准将特定find
调用转换为关联的 Perl 代码。File::Find
现在
Path::Class
代码可能看起来更简单/更容易阅读(对于相同的结果):在您的帮助下,我得以稳定“查找”。然而,将代码从 OS X 10.5 移动到 10.10再次破坏了它。最后的机会。'find' 实在是太迟钝了,文档不足且不一致,而且它是一个 unix 核心功能,看在 Pete 的份上!这个。这就是为什么我讨厌别人的代码。我开始埋头学习 File::Find,然后想“我在做什么?我可以在 20 分钟内自己编写代码”。
我总结了一下。
而且速度很快。而且很轻——这段代码的大小是格式化“find”的arg列表的代码的一半(并且更易于维护)!