findってあんまり使わないけど…
今頃になって、知ったというか、調べたというか…。
一体何年使っているんだと言われそうなくらい初期の頃から使っているのに、こんな使い方したことなかったなぁと、自分でも驚いた。
忘れないとは思うけど、きっと同じような人がいるだろうと思うので、書いておく。
これまでの使い方
いままで、findを使う時って、
- 特定の拡張子が含まれている
- サイズが1MB以上
- 何日前より古いファイル
- 30分以内に編集したファイル
なんて使い方が多かった。
でもって、中身を検索するならgrepだし…。
もちろん、パイプも使うし、xargsも使ってきた。
今回、はて?と考えた事
今回相談があって、LibreOfficeで編集ができないファイルがある。とな…。
調べてみると、オーナーがnobodyになっている。
ちょいちょい不具合もあるので、根本原因は調査中だけど、編集できないのは困るというので、急ぎで修正する必要がある。
さて、user_aのホームフォルダ以下で、user_aがユーザではないファイルを探す…。
まず、思いついたのは findだよなぁと…。
# find /home/user_a -user user_a
これだと、user_aが所有者のファイルがリストアップされる。
あれ? 否定はどうするんだ???と
grep -v はよく使うけれど、findの条件否定って、よくよく考えると使ったことがないような気がする。(20年近くUNIX系触っているのに…)
まずは、Helpだよね。
$ find --help
使用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
デフォルトのパスはカレントディレクトリです。デフォルトの評価式 (expression) は -print です。評価式は演算子、オプション、テストおよびアクションで構成されます。
演算子 (優先順位は降順です。特に指定がない場合は -and が暗黙的に使用されます):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
位置オプション (常に真): -daystart -follow -regextype
通常オプション (常に真。他の評価式の前に指定します):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race
テスト (N は +N、-N または Nで指定します): -amin N -anewer FILE -atime N -cmin N
-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
-readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]
actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
バグを発見した場合は findutils バグ報告ページ http://savannah.gnu.org/ を
使用して報告 (および修正の進捗を追跡) してください。Web を利用できない場合
は <bug-findutils@gnu.org> に E-mail を送ってください。
演算子のところに書いてあるじゃないか…。
terminalの高さが25行だと、ちょうどスクロールアウトするんだよね。
「!」か 「-not」を使えと。
$ find /home/user_a ! -user user_a
これだけだった。
でもって、存在を確認して、chown するだけ。
まあ、滅多に使わないんだろうな。
次回はいつ使うのやら…。
調べていたら、他にも便利なものがあった
久々に、find --help なんてやったので、良く読んでみると、actionの最初に「-delete」なんて書いてある。
???
ぐぐってみたら、最近のfindには用意されているらしい。
自分の常識では、-exec rm {} か xargs rm と覚えていたのに…。
$ find ~/ -name '.lock.*' | xargs rm
の代わりに、
$ find ~/ -name '.lock.*' -delete
でOKなんだってさ…。
(ちなみに、LibreOfficeが作成するlockファイルの残骸をまとめて消す処理ですが)
読んでみるもんだな。
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。