検索パスに*が含まれるこのコマンドは、ローカルサーバーで正常に機能します
Svr1$ find /path/*/foo/ -name "*20160208"
別のサーバーからリモートでこれを試してみると、機能しません
Svr2$ ssh Svr1 find '/path/*/foo/' -name "*20160208*"
エラーメッセージは次のとおりです。
find: stat() error /path/*/foo/: No such file or directory
ただし、*を使用しないように検索パスを変更すると、正常に機能します。このような:
Svr2$ ssh Svr1 find '/path/' -name "*20160208*"
私が間違っていることについて何か考えはありますか?
どうもありがとう。
問題は、findコマンドがディレクトリグロブ(シークする必要のあるディレクトリリスト)を補間/解釈せず、一致する必要のあるグロブとしてパターンを補間するだけであるということです。ディレクトリグロブを解釈するのは、実行するシェル自体ですfind内部。 ssh経由でfindを実行すると、このジョブを実行するシェルはありません。
幸いなことに、sshを介してシェルを実行することに対する規則はなく、必要なすべてのものを補間し、残りのワイルドカードをfind自体に保持して、シェルにコマンドを実行させます。
私が自分のマシンで使用したもののようなもの:
ssh lx@localhost "bash -c '/usr/bin/find /tmp/d* -name \"f*\" '"
lx@localhost's password:
/tmp/d1/f1
/tmp/d2/f2
あなたがそれを書く方法はローカルホストで評価されます、それは通常あなたが望まないものです。他のホストで評価するには、シーケンスをエスケープする必要があります。このような何かがそれをするべきです:
Svr2$ ssh Svr1 "find /path/*/foo/ -name \"*20160208*\""