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

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

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

for i in 'find / -name java 2>/dev/null' 
do
echo $i checking
$i -version
done

我收到一个错误:

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

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

问题是什么?

答案1

您从循环中收到该错误,for因为您的 for 循环实际上正在循环元素——细绳,而不是命令:“ find / -name java 2>/dev/null”,所以它正在运行:

echo find / -name java 2>/dev/null checking
find / -name java 2>/dev/null -version

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

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

for i in `find / -name java 2>/dev/null` 
do
  echo $i checking
  $i -version
done

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

find / -name java -exec sh -c '"$1" -version' sh {} \; 2>/dev/null

感谢 don_crissti 的指出Stéphane 的 find ... exec 的更好版本并间接提醒我一个 bash 方法比以下更好的方式来查找和执行结果循环查找

shopt -s globstar dotglob
for match in /**/java
do
  echo match is "$match"
  "$match" -version
done

相关内容