Unix find 是否被多个修剪和类型 f 淹没?

Har*_*ica 0 find

我在这个魔方上花了几天时间。我为解决一个问题所做的任何事情都会破坏另一个问题。

我使用的是 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吗?

L. *_*son 5

你需要一个“或”来完成第二个匹配——没有一条路径可以同时匹配-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)