使用find排除具有特定前缀的目录

时间:2014-03-18 22:19:00

标签: macos bash unix

如果我没有遗漏那些显而易见的东西,那么OSX版本的bash与Linux不同,因为我认为this question将提供我需要知道的所有内容。它没有。

我正在尝试使用 find 来查找所有不以“。”开头的目录。 (Mac OS X使用.-前缀作为隐藏文件夹,例如/volumes/OD/.Trashes)。我想将所有非隐藏目录通过管道传输到rysnc,以定期镜像两个本地目录。

我测试过以确保我在这里使用此代码正确使用:

find /volumes/OD -type d -iname ".*"

找到目录:

/volumes/OD/.Trashes
/volumes/OD/.Spotlight-V100
/volumes/OD/.fseventsd

到目前为止一切顺利。但是当我尝试否定我刚刚测试的条件时,我收到一个错误:

find /volumes/OD -type d -iname ! ".*"

产生此错误:

find: .*: unknown primary or operator

我试过逃避“。”用“\”,但我只得到相同的错误信息。我已经尝试删除括号,但我得到相同的错误消息。我在这里错过了什么?我应该使用iname以外的其他运算符吗?

3 个答案:

答案 0 :(得分:5)

!必须在条件之前:

find    /volumes/OD    -type d    '!' -iname '.*'

也就是说,您不需要将文件列表从find传输到rsync;我确信后者提供了一种排除点文件夹的方法。也许

rsync --exclude='.*' ...

答案 1 :(得分:1)

原因: !是以下职位的前缀:

!23
!routENTER

你应该这样做:

find    /volumes/OD    -type d    \! -iname '.*'

答案 2 :(得分:1)

ruakh得到了正确的答案,但这是另一种搜索方式:

find /volumes/OD -type d -not -iname ".*"