Mac 终端命令"find":结果输出中的双斜杠代表什么意思?

我使用find命令在大型和嵌套的目录结构中进行搜索。 结果输出中有时会包含双斜杠(//)。 示例(在“下载”之后):
#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf

我最初以为它会标记当前的工作目录。但事实并非如此。

这个双斜杠有什么意义?

通常我将结果复制到剪贴板中,切换到Finder。然后按下 "shift" + "command" + "g" 并将路径(直到文件)粘贴到框中。这样就可以打开包含该文件的目录。

效果很好。但是我必须手动删除双斜杠。

因此:我该如何避免它?


3请注意,您无需删除双斜杠。双斜杠只在路径的开头才具有特殊意义,而且只有当它们是确切的两个斜杠时才有效。路径中间或结尾的多个斜杠,以及开头不是恰好两个斜杠的任意数量的斜杠,都等同于一个斜杠。这是由POSIX/SUS规范保证的。 - Jörg W Mittag
2个回答

< p >< code >find 这个命令相当字面。当你告诉它在“~/Downloads/”目录中搜索时,它会将此目录(包括尾部的斜杠)作为搜索结果的前缀。由于你提供的路径末尾有一个不必要且无关紧要的斜杠,因此在输出结果中会多出一个不必要且无关紧要的额外斜杠。

解决方法:从搜索目录中去除尾部的“/”斜杠:

#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf
#> find ~/Downloads -iregex ".*some.*"
/Users/michael/Downloads/subDirectory/some_file.pdf

这个双斜杠是什么意思? 意味着你正在使用奇怪的旧版BSD find。 我该如何避免它? 你确实可以在原始命令中省略尾部的斜杠,但由于它会通过制表符自动添加(你应该尽可能多地使用制表符补全),而且尾部斜杠实际上在其他许多地方用于确保你处理的是目录而不是文件,省略它是违反直觉且愚蠢的。 相反,我建议你做以下几件事情之一: a)创建一个将find管道传递给sed的包装器:| sed 's@//@/@' b)使用'brew install findutils'安装GNU的findutils,然后直接使用'gfind',将'find'别名为'gfind',或者将/usr/local/opt/findutils/libexec/gnubin添加到你的路径中(这还会添加GNU findutils的'locate'、'updatedb'和'xargs')。 c)切换到一个合适的GNU/Linux操作系统,这样一开始就不会有这个问题(以及其他一千个问题)。 :p

1只需将 set mark-directories off 添加到您的 .inputrc 文件中,然后一切都会顺利进行。来自那些古老的 BSD 人士之一。 - fd0
@fd0 如果这样的话,就无法区分具有相同名称的目录和文件;这里有点不太完善的是BSD的find命令,而不是bash或readline。 - Jan Kyu Peblik