環境変数に設定されているディレクトリのリストからファイルを見つける方法は?

環境変数に設定されているディレクトリのリストからファイルを見つける方法は?

私はそれがどこにあるかもしれないかを見つけようとしています$LD_LIBRARY_PATH。基本的に私は以下を試しています。

 find $LD_LIBRARY_PATH -name "*libdl*"

ただし、変数に複数のエントリがあり、my aを区切るため、上記のコマンドは失敗します:。エラーが発生します。

    No such file or directory

どうすればいいですか?

答え1

* PATH変数はコロンで区切られたディレクトリーのリストなので、単語の分割にコロンを使用できます。

古いIFSを保存して復元するには、次の行のコメントを外します(推奨)。

#oldIFS="$IFS"
IFS=:
set -o noglob # disable the glob part of the split+glob operator
              # unlikely to be needed as library directories
              # are unlikely to have wildcard characters in their
              # name.
find -H $LD_LIBRARY_PATH -mindpeth 1 -maxdepth 1 -name "*libdl*"
#IFS="$oldIFS"
#set +o noglob

-Hこれらのコンポーネントの1つがシンボリックリンクの場合は必須です$LD_LIBRARY_PATH-mindepth 1(GNU拡張、現在は他の多くの実装で見ることができます)コンポーネントの自己一致を防ぎ、サブ-maxdepthディレクトリから検索をスキップします(動的リンカーで検索する意図はありません)。

Bashの略語はデフォルト値を想定しており、ディレクトリにそのデフォルト値$IFSの文字$IFS(スペース、タブ、および改行)やワイルドカードが含まれていないことが知られており、これらのディレクトリのいずれもシンボリックリンクもサブディレクトリもなく、これらの名前はディレクトリ自体です。がパターンと一致しません:

find -H ${LD_LIBRARY_PATH//:/ } -name "*libdl*"

これは置換コマンド各コロンを空白に変換します(ksh93からコピーした機能)。

zsh次の仮定をせずにを使用してください。

print -rC1 - ${(s[:])^LD_LIBRARY_PATH}/*libdl*(ND)

関連情報