我在这个魔方上花了几天时间。我为解决一个问题所做的任何事情都会破坏另一个问题。
我使用的是 POSIX 兼容的 MacOS X 10.5 到 10.14。我从 Perl 脚本的上下文中调用它
system ("find blah blah > FILENAME");
Run Code Online (Sandbox Code Playgroud)
我需要 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
Run Code Online (Sandbox Code Playgroud)
双 / 的原因是find的打印输出包括 // 因为起点以 / 结尾。修剪路径必须一致,否则它们将不匹配。为什么起点以/结尾?因为如果没有,find在名称中带有空格的任何起点都会失败,例如“My HD”。试过了。
现在, find 仅排除列表中的第一个目录。其余的,它只是忽略。我目前正在 OS X 10.5 上进行测试,但我需要可以在任何地方使用的东西。
多个修剪 + 仅文件 + 文件名中的空格是否太远了?我只是要求太多find吗?
你需要一个“或”来完成第二个匹配——没有一条路径可以同时匹配-path '/Volumes/foo//dev/*'
和-path '/Volumes/foo//net/*'
Find -x '/Volumes/foo/'
\( -path '/Volumes/foo//dev/*'
-o -path '/Volumes/foo//net/*'
-o -path '/Volumes/foo//system/*' \) -prune
-o -type f -print
Run Code Online (Sandbox Code Playgroud)