検索ツールを使用してシステムパス($ PATH)でファイルを検索するには?あるいは、検索の開始点ディレクトリを式としてどのように指定できますか?

検索ツールを使用してシステムパス($ PATH)でファイルを検索するには?あるいは、検索の開始点ディレクトリを式としてどのように指定できますか?

たとえば、システム$ PATHの一部であるすべてのディレクトリで特定のバイナリを参照するすべてのシンボリックリンクを探したいとします。すべてのディレクトリを手動で指定すると、これを正常に実行できます。

sudo find ~/bin /home/samokat/.local/bin /home/samokat/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /snap/bin -lname /opt/openoffice4/program/soffice

しかし、 $PATH 拡張でコマンドを使用しようとすると、次のようになります。

sudo find `echo $PATH | tr ':' ' '` -lname /opt/openoffice4/program/soffice

エラーと結果が表示されます。

find: ‘~/bin’: No such file or directory
/usr/bin/soffice.link-to-openoffice-bak
echo $PATH | tr ':' ' '

正しいパスを出力してください。

~/bin /home/samokat/.local/bin /home/samokat/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /snap/bin

以下も機能しません。

sudo find `echo $PATH | tr ':' ' ' | xargs` -lname /opt/openoffice4/program/soffice
sudo find { `echo $PATH | tr ':' ' ' | xargs` } -lname /opt/openoffice4/program/soffice
sudo find eval "echo $PATH | tr ':' ' ' | xargs" -lname /opt/openoffice4/program/soffice
echo $PATH | tr ':' ' ' | xargs | sudo find -lname /opt/openoffice4/program/soffice  # runs some long computation

starting pointディレクトリを計算されたパラメータにどのように渡すことができますかfind?可能ですか?

ベストアンサー1

すでにアクセス権があるディレクトリを含める必要があるため、sudo使用する必要はありません。$PATH

この文字は、~シェルや他のシェルのホームディレクトリへの組み込みショートカットです。bashしかし、あなたの例で利用できるほど遅く評価されていません。 (引用された式内でも評価されません。)

を設定するときに$PATHこのようなものを使用するのではなく、PATH=~/bin:$PATHより明示的な選択肢を使用することを検討してくださいPATH="$HOME/bin:$PATH"

一部のコードでは、ディレクトリ名のスペースを処理する$PATH代替ソリューションは次のとおりです。

( IFS=:; for p in $PATH; do [ -d "$p" ] && find "$p" -maxdepth 1 -lname '/opt/openoffice4/program/soffice'; done )

もっと読みやすく、

(
    IFS=:
    for p in $PATH
    do
        [ -d "$p" ] && find "$p" -maxdepth 1 -lname '/opt/openoffice4/program/soffice'
    done
)

おすすめ記事