find コマンドで for ループを使用する

find コマンドで for ループを使用する

私のシステムのすべての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] [path...] [表現式]

問題は何ですか?

ベストアンサー1

forforループが実際に繰り返されているため、ループ内で対応するエラーが発生します。一つ要素--ひも、コマンドの代わりに " 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

おすすめ記事