このコマンドを実行してもfind $HOME/MySymlinkedPath -name "run*.sh"
何も起こらず、エラーも発生しません (「MySymlinkedPath」は、$HOME 以外のハード ドライブへのシンボリック リンク パスです)。
これらも失敗します:
find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"
念のため確認しますが、この存在しないパスは (当然ですが) 失敗するfind $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"
ので、パスは見つかります (そのエラーは発生しないため) が、find
そのパスに対する検索は実行されず、今はまったくわかりません。
cd $HOME/MySymlinkedPath
これは、最初にこのようにパス参照を削除した場合にのみ機能しますfind -name "run*.sh"
が、これは私のスクリプトには適していません。
追加情報:
このコマンドは通常どおりに動作しますls $HOME/MySymlinkedPath/run*.sh
が、そこに行ってcd $HOME/MySymlinkedPath
これを実行するとls ..
、結果は私が期待していたもの (シンボリックリンクされたパスが配置されているパスのリスト) ではなく、別のメディア/ハードドライブ上の実際のパスのリストが返されます。
pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath
再考:
これは と の問題ですfind
かls
、それとも私のシステムの問題ですか? それとも、これは予想されたことであり、まったく問題ではありませんか?? 私は Ubuntu 12.10 を使用しています。テストしたすべての端末で失敗するので、端末の「問題」ではないようです。
答え1
ここが答えです。しかし、その質問は、問題の対象が bash であることを示しています。
説明は、find
が を見つけるというものです"$HOME/MySymlinkedPath"
。これはディレクトリではなくシンボリック リンクなので、再帰的な下降はそこで停止します。式が一致した場合"$HOME/MySymlinkedPath"
(たとえば、 の場合find "$HOME/MySymlinkedPath" -name 'My*'
)、 はfind
それを一致として出力します。
そこで指摘されているように、これを処理してすべてのスクリプトを修正する最も簡単でクリーンな方法は、次の方法であることがわかりました。
find "$HOME/MySymlinkedPath" -name "run*.sh"
スラッシュを追加するだけで、find
シンボリック リンクからではなく、シンボリック リンクのターゲットから開始されます。
find "$HOME/MySymlinkedPath/" -name "run*.sh"
あるいは、-H
オプションを に渡して (パスの前に最初に指定する必要があることに注意してください)、コマンドラインで渡されたシンボリック リンクをトラバースするように指示します。 (これは、再帰降下中に遭遇したシンボリック リンクをトラバースするように指示するものfind
とは異なります。)-L
find
find -H "$HOME/MySymlinkedPath" -name "run*.sh"
そして最終的に、ここでは-L
(フォルダを介してシンボリックリンクした複数のファイルシステムのため)最もうまく機能しました。しかし、問題のないエラーメッセージが大量に生成されたため、2>/dev/null
; を追加し、次のエイリアスも作成することにしましたalias find='find -L'
。
find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null