円形のシンボリックリンクを見つけるにはどうすればよいですか?


12

HP-UXシステムで作業していますが、円形のシンボリックリンクがあるかどうかを確認したいと思います。

これまでのところ、私はコマンドを使用しています:

ls -lrt  `find ./ -follow -type l`

ただし、結果として現在のディレクトリでls -lrtを実行するだけです。

システム内のすべての円形シンボリックリンクを検索するには、どのコマンドを使用する必要がありますか?


1)findコマンドが単に印刷する.か、または何も印刷しないため、現在のディレクトリを取得しています(したがって、単に実行している、ls -lrtまたはls -lrt .findこれを修正する方法を説明するHP-UXについて十分に知らない(おそらく明示的に必要-printですか? )。2)「円形」とはどういう意味ですか? ./a -> ./bそして./b -> ./a?どう/home/foo/a -> /home?それとも/home/foo/a -> /home/bar/home/bar/b -> /home/foo
DerfK

循環とは、ループを作成できるあらゆる種類のリンクを意味するので、上記のすべてが可能です。今、-printを試しています。
ウラジミール

また、なぜ-follow実際のリンクが含まれていないのが実際のリンクが結果であるのですか?
ウラジミール

がなければ-followfindリンクが指すファイルではなく、リンク自体を調べます。そのfind . -type lため、リンクされているもの(であるため-type l)を、それらが指しているもの(ファイルまたはディレクトリ、またはファイルまたはディレクトリを指している他のリンク)を見ることさえせずに印刷します。
DerfK

回答:


18

GNU findのマンページには、すべてのPOSIX findがファイルシステムループを検出し、これらの場合にエラーメッセージを出力することになっていると書かれています。

find . -follow -printf ""

GNU形式のループを見つけることができた検索、上./a -> ./bおよび./b -> ./aエラーを印刷

find: `./a': Too many levels of symbolic links
find: `./b': Too many levels of symbolic links

(これも機能しましたa->b->c->a

同様に、フォーム./foo/x -> .../foo/a -> ./bar+のループは./bar/b -> ./fooエラーを出力しました

find: File system loop detected; `./foo/a/b' is part of the same file system loop as `./foo'.
find: File system loop detected; `./bar/b/a' is part of the same file system loop as `./bar'.
find: File system loop detected; `./foo/x' is part of the same file system loop as `.'.

読み取り以外の出力で何かをしたい場合は、stderrからstdoutにリダイレクトし、エラーメッセージを解析できるスクリプトにパイプする必要があります。


これは、ループがあった場合にエラーメッセージが表示されることを意味しますか?
ウラジミール

GNU findおよび-follow、はい。
DerfK

わかりましたが、ls使用していないときに実際のリンクを取得するのではなく、単に取得することをどのように説明し-followますか?
ウラジミール

1
それがシェルの仕組みです。lsコマンドの出力を使用してコマンドを実行するように要求しましたfind。あなたのfindシェルを実行してコマンドは、何も印刷されませんでしたls、現在のディレクトリを示しています何も、と。
DerfK

DerfKのソリューションは、cygwinシェルから起動することにより、Windows 7のサイクルも検出します。
ドンゲートリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.