帮助理解 Solaris 上的 `find` 语法

考虑遵守文件:

$ find findtest                     
findtest
findtest/test1
findtest/test1/start.ksh
findtest/test2
findtest/test2/start.ksh
findtest/test3
findtest/test3/start.ksh
findtest/test4
findtest/test4/start.ksh

我的询问是关于在 -exec 调用中使用 {}。 在标记结果文件时,它的功能与我预期的一样:

$ find findtest -name test[1-4] -exec ls -d {} \;           
findtest/test1
findtest/test2
findtest/test3
findtest/test4

但是,在课程中使用时,它似乎没有被扩大:

$ find findtest -name test[1-4] -exec md5sum {}/start.ksh \;     
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory

如何使用 find -type d -exec 访问低功耗结构数据? 我知道我可以使用这样的 for 循环,但我想知道它是否可以在一个 find 调用中执行:

$ for f in $(find findtest -name test[1-4]); do md5sum "$f"/start.ksh; done
d41d8cd98f00b204e9800998ecf8427e  findtest/test1/start.ksh
d41d8cd98f00b204e9800998ecf8427e  findtest/test2/start.ksh
d41d8cd98f00b204e9800998ecf8427e  findtest/test3/start.ksh
d41d8cd98f00b204e9800998ecf8427e  findtest/test4/start.ksh
2
2022-06-07 14:40:17
资源 分享
答案: 2

find 命令的 POSIX 标准 只要求通过文件名更改分隔符,并且只是第一个。 使用 {}/start.ksh 会导致未定义的行为。

只有两个字符“”的参数将被一组聚合路径名替换,每个路径名作为一个单独的参数传递给调用的能量,其顺序与累积的顺序相同。 任何类型的 2 个或更多路径名集的大小都将受到限制,因此执行的能量不会创建系统是 ARG_MAX 限制被超越。 如果存在一个以上只包含两个字符“”的参数,则未指定习惯。

如果实用程序名称或参数字符串包含两个字符“”,而不仅仅是两个字符“”,则由应用程序定义 find 是否更改这两个字符或使用字符串而不进行调整。

使用 Solaris find 执行所需操作的一种方法当然是该命令:

find findtest -name "test[1-4]" -exec sh -c 'md5sum $1/start.ksh' foo {} \;

一种更快的方法是:

find findtest -name "test[1-4]" -exec sh -c 'for i; do md5sum "$i/start.ksh"; done' foo {} + 
4
2022-06-07 15:08:34
资源
  1. 实际上,您的覆盖物在产生 find 之前会增加 test[1-4]。 您需要将其保留为 '…'
  2. {} 仅当它是一个单独的令牌时才作为模式处理

-exec 本身通常很昂贵,也建议与路由 + 一起使用,或者避免用于馈送 xargs

我知道我可以使用与此类似的 for 循环,但我想知道它是否可以在一次 find 调用中完成:

find findtest -name 'test[1-4]' -print0 | xargs -0I{} -- md5sum '{}/start.ksh' bdsh 成功运行 md5sum bdsh,同时提供所有文档名称。

1
2022-06-07 15:08:03
资源