2014年2月19日水曜日

(FreeBSD) つながっていないシンボリックリンクを、findコマンドで削除する

この前、たまたま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]





20140218





0 件のコメント:

コメントを投稿