私はソースコードを検索するときに主にfind
環境変数をパスとして使用します。最近、環境変数をシンボリックリンクに置き換えました。これにより、Bashのシェルの完成が中断されました。シンボリックリンクを使用すると機能しfind
ませんが、シンボリックリンクが指す実際のパスを使用して見つけることができます。
ln -s /some/source/dir /the/source
export SYMLINK=/the/source
export DIR=/some/source/dir
find $SYMLINK -name file.c // doesn't find anything
find $DIR -name file.c // works as expected
この例では、$ SYMLINKは$ DIR値へのシンボリックリンクです。
それでは、BashがSymlink環境変数を異なる方法で処理するのはなぜですか?
答え1
これは bash ではなく find です。ほとんどのユーティリティが同じ原則に従うことがわかります。
- ファイルの内容を操作する場合、通常のファイルへのシンボリックリンクは実際のファイルと同じです。
- ディレクトリエントリに対して操作を実行する場合、シンボリックリンクは独自のカテゴリです。
これを実行すると、ディレクトリではなくfind $SYMLINK
オブジェクトfind
が表示されるため、ディレクトリに移動しません。ディレクトリへのシンボリックリンクをそのディレクトリとして扱うには、/
末尾にを追加します(一部の破損したシステムまたはコマンドにはこれが必要な場合があります"$SYMLINK/."
)。
find "$SYMLINK/" -name file.c
場合は、ターゲットを指定したように、コマンドラインからすべてのシンボリックリンクを処理するように指示するfind
このオプションを使用することもできます。-H
find -H "$SYMLINK" -name file.c
答え2
bash
そうではありませんfind
。再帰ディレクトリの巡回でシンボリックリンクをたどると、無限ループが発生します(ln -s foo .
互換性パスを提供する一般的な方法を検討してください)。 POSIXにはそれを上書きする述語がfind
含まれています-follow
。おそらくこの場合はもっと便利です。 GNU findは、-H
ナビゲーション中に検出されたシンボリックリンク拡張を避けながら、引数として直接指定されたシンボリックリンクのみを追跡します。エイリアスと組み合わせて使用できます。
alias find='find -H'