将 for 循环与 find 命令一起使用

r0t*_*0tt 3 find for

我想阅读我系统上的所有 java 版本。

for i in 'find / -name java 2>/dev/null' 
do
echo $i checking
$i -version
done
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

查找:路径必须位于表达式之前:2>/dev/null

用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [路径...] [表达式]

问题是什么?

Jef*_*ler 5

您从循环中收到该错误,因为您的 for 循环实际上是在一个for元素上循环-字符串,而不是命令:“ ”,因此它正在运行:find / -name java 2>/dev/null

\n\n
echo find / -name java 2>/dev/null checking\nfind / -name java 2>/dev/null -version\n
Run Code Online (Sandbox Code Playgroud)\n\n

...这就是find出现错误的地方。

\n\n

您可能正在尝试执行以下操作:

\n\n
for i in `find / -name java 2>/dev/null` \ndo\n  echo $i checking\n  $i -version\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

...(用反引号而不是单引号),在这种情况下,我会建议更多类似的内容:

\n\n
find / -name java -exec sh -c \'"$1" -version\' sh {} \\; 2>/dev/null\n
Run Code Online (Sandbox Code Playgroud)\n\n

感谢 don_crissti 指出St\xc3\xa9phane\ 的 find ... exec 的更好版本,并间接提醒我 bash 方法,这是一种比循环 find更好的查找和执行结果的方法:

\n\n
shopt -s globstar dotglob\nfor match in /**/java\ndo\n  echo match is "$match"\n  "$match" -version\ndone\n
Run Code Online (Sandbox Code Playgroud)\n