Twitterでそんな処理について見かけたので、調べた内容を残しておく。 GNU findの場合だと、-xtype, -deleteオプションがあるので、それを利用する。

find ./ -xtype l
find ./ -xtype l -delete
blacknon@test-ubuntu:~/testdir$ ls -al
合計 20
drwxr-xr-x  2 blacknon blacknon 4096  7月 25 10:38 .
drwxr-xr-x 52 blacknon blacknon 4096  7月 24 08:54 ..
-rw-rw-r--  1 blacknon blacknon    6  5月  5 16:12 test
-rw-r--r--  1 blacknon blacknon   10  5月  5 16:12 testfile1
lrwxrwxrwx  1 blacknon blacknon    9  7月 25 10:38 testfile1.ln -> testfile1
-rw-r--r--  1 blacknon blacknon   10  5月  5 16:12 testfile2
lrwxrwxrwx  1 blacknon blacknon    9  7月 25 10:38 testfile2.ln -> testfile2
lrwxrwxrwx  1 blacknon blacknon    9  7月 25 10:38 testfile3.ln -> testfile3
blacknon@test-ubuntu:~/testdir$ find ./ -type l
./testfile2.ln
./testfile3.ln
./testfile1.ln
blacknon@test-ubuntu:~/testdir$ find ./ -xtype l
./testfile3.ln
blacknon@test-ubuntu:~/testdir$ find ./ -xtype l -delete
blacknon@test-ubuntu:~/testdir$ find ./ -type l
./testfile2.ln
./testfile1.ln
blacknon@test-ubuntu:~/testdir$ ls -al
合計 20
drwxr-xr-x  2 blacknon blacknon 4096  7月 25 10:39 .
drwxr-xr-x 52 blacknon blacknon 4096  7月 24 08:54 ..
-rw-rw-r--  1 blacknon blacknon    6  5月  5 16:12 test
-rw-r--r--  1 blacknon blacknon   10  5月  5 16:12 testfile1
lrwxrwxrwx  1 blacknon blacknon    9  7月 25 10:38 testfile1.ln -> testfile1
-rw-r--r--  1 blacknon blacknon   10  5月  5 16:12 testfile2
lrwxrwxrwx  1 blacknon blacknon    9  7月 25 10:38 testfile2.ln -> testfile2

ちなみに、Mac等の場合だとGNU findが入ってないので、以下の様にする必要がある。

find . -type l ! -exec test -e {} \; -print
find . -type l ! -exec test -e {} \; -print | xargs rm