たとえば、システム$ 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
)