考虑一些常见的 *nix 系统(例如 Debian、CentOS、Arch 和 Kali)。
我一直用find
;我不记得使用过 GNU find,但是来自一个例子我发现我假设 GNU find 的语法可能更简单(尽管可能允许较少的操作)。
我有两个问题:
是
find
常见系统中默认的“查找或操作”实用程序还是系统附带两个都find
和GNU find
?曾是
GNU find
故意的更简单吗find
?
答案1
GNU 实用程序通常实现 POSIX 标准,然后还通过额外的功能对其进行扩展以增加便利性(但另一方面,也降低了 Unices 之间的可移植性)。可移植性方面就是为什么您有时会在此站点上看到答案或评论,这些答案或评论非常仔细地指出何时假设使用 GNU 实用程序或实用程序的某些其他特定实现。
如果你使用的是Linux系统,你会非常可能正在使用 的 GNU 实现find
,并且您可能不会find
安装另一个。在非 Linux 系统上,您将拥有本机find
并且还可以安装 GNU find
(通常会以名称安装gfind
,或者较少使用gnufind
)。
与大多数 GNU 实用程序一样,GNUfind
实现并延伸 标准find
规格。因此,它并不是“更简单”,而是为了更方便而更复杂,并且用它来完成某些复杂的任务比使用严格符合标准的find
.
find
例如,扩展实现通常会实现标准未提及的-maxdepth
和谓词,特别是 GNU 还必须使用各种格式可能性(标准没有)打印找到的路径名,以及用于执行常规操作的谓词路径名上各种类型的表达式匹配,以及许多其他非标准谓词,其中一些也可以在其他实现中找到(可能具有稍微不同的语义,就像根据所使用的内容而工作略有不同) 1 ).-mindepth
find
-printf
find
-printf
find
-execdir
find
您链接到的答案中使用的谓词-delete
是非标准的,但由 GNUfind
以及find
其他一些非 Linux 系统实现。如果您使用它来删除非空目录, GNUfind
会-delete
抱怨,但 OpenBSD 等相应选项find
不会(也不会删除非空目录)。
大多数 Linux 系统,无论发行版如何,都使用相同的 coreutils 和 findutils 工具集(显然存在 busybox 等变体)。要使用一组完全不同的工具实现,您必须迁移到一个开源 BSD 系统或 macOS、Solaris、AIX 或其他一些商业 Unix。
1 GNU在使用时会在路径名前面加上find
前缀,而其他一些实现则不会。./
-execdir
答案2
人们通常所说的 Linux 更适合称为 GNU/Linux:Linux 加 GNU。因此,您使用的工具可能是 GNU。
- Linux:一个内核,它用于 GNU/Linux、Android 和许多其他系统。
- GNU:一种操作系统,通常与 Linux 内核一起使用,但也可以与 BSD、Hurd、Cygwin(Microsoft Windows 的 DLL,它伪装成内核)、WSL(Windows Subsystem for Linux:没有 Linux 的 GNU)一起使用, Microsoft Windows)、HPUX、Solaris、Dec Athena 等。
因此您可能正在使用 GNU find。
GNU 是一个重写的项目,免费(免费是指自由,而不是价格)版本对于所有 Unix,包括诸如 之类的工具find
,GNU 项目并不担心 POSIX 合规性:它将在有意义的地方合规,但也会做出改进。
另外,您认为只有一个的假设find
是错误的。