web-dev-qa-db-ja.com

unixfindコマンドのパスでワイルドカードを使用する

検索パスに*が含まれるこのコマンドは、ローカルサーバーで正常に機能します

Svr1$ find /path/*/foo/ -name "*20160208"

別のサーバーからリモートでこれを試してみると、機能しません

Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/Sudo -S find /path/*/foo/ -name "*20160208*"

エラーメッセージは次のとおりです。

find: stat() error /path/*/foo/: No such file or directory

ただし、*を使用しないように検索パスを変更すると、正常に機能します。このような:

Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/Sudo -S find /path/ -name "*20160208*"

私は何が間違っているのですか?文字列の一部を引用またはエスケープする必要があると思いますが、理解できません。

どうもありがとう。

1
LLJ

*はローカルシェルによって展開されます。あなたはあなたの議論を引用するべきです

ssh Svr1 /usr/local/bin/Sudo -S find '/path/*/foo/' -name "20160208"
2
Matteo

@Matteoが言ったように、ローカルシェルから*をエスケープする必要があります。彼は最初の例でそれを行いました:

ssh Svr1 /usr/local/bin/Sudo -S find '/path/*/foo/' -name "20160208"

別の方法として、一重引用符('...')と円記号(\)がローカルシェルから*ワイルドカードを「非表示」にするので、これらのいずれかも機能するはずです。

ssh -t Svr1 /usr/local/bin/Sudo 'find /path/*/foo/ -name *20160208'

または

ssh -t Svr1 /usr/local/bin/Sudo find /path/\*/foo/ -name \*20160208

補足として、ssh-t引数を含めて、Sudoがパスワードを要求するためのttyを持っていることを確認してください。これは[〜#〜]はるかに[〜#〜]コマンドラインIMOにパスワードを入力するよりも優れています。 Sudoパスワードをパイプする必要がある場合は、cat secret.txt | find ...を介して行うことをお勧めします。これにより、psやアクセス権を持つすべてのユーザーにパスワードが表示されないようになります。シェルの履歴(~/.historyおよびバリアントを含む)

1
crimson-egret