この前、たまたまman findして見つけたのですが、EXAMPLESにこんなのが載っていました。
find -L /usr/ports/packages -type l -exec rm -- {} +
Delete all broken symbolic links in /usr/ports/packages.
参照先が存在しないシンボリックリンクを削除できる、ということです。
一瞬、「あれれ?これじゃ、すべてのシンボリックリンクを削除してしまうんじゃないの?」と思ったのですが、「-L」オプションのおかげで、そうはならないのでした。
-L Cause the file information and file type (see stat(2)) returned
for each symbolic link to be those of the file referenced by the
link, not the link itself. If the referenced file does not
exist, the file information and type will be for the link itself.
This option is equivalent to the deprecated -follow primary.
-Lオプションがついてると、
- シンボリックリンクの場合は、参照先の情報が使われるようになって、
- しかし、参照先が存在しない場合のみシンボリックリンクそのものの情報が使われる
とのこと。なるほど。だから、「-type l」でひっかかるのは、参照先が存在しないシンボリックリンク、ということになるんですね。
それから、「-exec ... {} +」という指定方法があるのも初めて知りました。
-exec utility [argument ...] {} +
Same as -exec, except that ``{}'' is replaced with as many path-
names as possible for each invocation of utility. This behaviour
is similar to that of xargs(1).
なるほど、こっちを使った方がプロセスを起動する回数が減るので、効率がいい場合がありますね。xargsは、いつも使い方を忘れてしまうので、findだけでできるなら手間いらず。
まだまだfindコマンドは知らない機能がたくさんあるなと思いました[E:happy01]
0 件のコメント:
コメントを投稿