よく使うコマンドfindまとめ 2009 年 2 月 21 日

subversionの.svnファイル・ディレクトリを全て削除する。
find . -name .svn -exec rm -rf {} \;

- find の -mtime +n のまとめ
find の -mtime +n の検索対象となるファイルは以下の通り。

mtime +0 今から24時間以上前のファイル
mtime +1 今から48時間以上前のファイル
mtime +2 今から72時間以上前のファイル

(n + 1) * 24

find . -name “*.png” -atime +30 -print
「.」以下から30日以上前に更新されたpng形式のファイルを検索して表示する

find /home -name file1 -user user1
/home」以下からuser1が作成したfile1を検索する

指定したディレクトリ以下で30分以内に更新されたファイルを出力する
find ./ -type f -mmin -30

指定したディレクトリ以下で30日以内に更新されたファイルを出力する
find ./ -type f -mtime -30

指定したディレクトリ以下の *.java ファイルを削除する
find ./ -name “*.java” | xargs rm -Rf

指定したディレクトリ以下にあるHTMLファイルのオーナーを変更する
find ./ -type f -name “*.html” | xargs chown www-data:www-data

指定したディレクトリ以下にある複数ファイルの文字列を一括置換
for i in `find ./ -name “*.html”`; do sed -e ’s/hoge/page/g’ $i > $i.new && mv $i.new $i; done

指定したディレクトリ以下にある複数ファイルの文字コード EUC-JP を UTF-8 に一括変換する
for i in `find ./ -name “*.jsp”`; do iconv -f EUC-JP -t UTF-8 $i > $i.new && mv $i.new $i; done

指定したディレクトリ以下の複数ファイルの改行コード CRLF を LF に変換
for i in `find ./ -type f`; do tr -d ‘\r’ < $i > $i.new && mv $i.new $i; done

◆カレントディレクトリ以下にある空のディレクトリを確認しながら削除
$ find . -type d -empty -ok rmdir {} \;

[主なオプション]
-name ファイル名及びディレクトリ名にマッチするものを表示
-iname -nameと同じだが、大文字小文字を区別しない
-regex ファイル名が正規表現にマッチするものを表示
-iregex regexと同じだが、大文字小文字を区別しない
-type ファイルタイプを指定。タイプにはd(ディレクトリ)、f(ファイル)、l(シンボリックリンク)を指定
-emtpy ファイルが0byteもしくは中身のないディレクトリを表示
-size ファイルのサイズで検索。通常kオプションをつけてキロバイトにて指定

[使用例]

#空のファイルを削除
find . -empty -exec rm {}\; #ユーザ確認を求めない
find . -empty -ok rm {}\; #ユーザ確認を求める

※{}にはfindで引っかかったファイル名が引数として渡ります

#ファイルの数を調べる
find . -type f |wc -l

#findで見つかったファイルの中身をgrepする
find ./ -type f -exec grep https://www.ksknet.net {} \;

#ディレクトリ以下を再帰的に置換
sudo find . -type f -exec sed -i ’s/置換前/置換後/g’ {} \;

#1000kを越えるファイルを検索
find ./ -size +1000k

#ファイル所有者がtomのユーザを検索
find ./ -user tom

#ファイル名がhtmlもしくはcgiで終わるファイルを表示
find ./ -type f -iregex “.*\.html$” -or -iregex “.*\.cgi$”

#ファイル属性による検索(アクセス権限による検索)
find ./ -perm 755

#日付による検索
find ./ -daystart -ctime +2

補足 +2 と -2 では動作が異なります。+2では2日前より古いファイル、-2では2日前より新しいファイルを返します。
-ctime の他に -mtime -atime などがあります。

#日付による検索その2 (30日前より以前に作成されたファイルを削除)
find ./ -ctime +30 -type f -exec rm -f {} \;

[補足]
findは基本的にand検索をします。OR検索の場合は-oオプションを使用すること。

$ find / -name passwd
/usr/bin/passwd
/usr/sbin/passwd

passwdという名前で、かつパーミッションが0700のファイルを検索
$ find / -name passwd -perm 0700
/usr/sbin/passwd

setuidでrootに設定されたファイルをすべて検索
$ find /usr -perm 4755 -user root

/tmpに含まれているファイルをすべて削除したいが、ディレクトリだけはそのまま保持したいという場合
$ find /tmp -type f -exec rm -f {} \;
種類がf(通常ファイル)のファイルを探し、それぞれのファイル({}で示されている)に対してコマンドrm -fを実行している。-execに渡されるコマンドは、バックスラッシュとセミコロン(\;)で終えなければならないことに注意
自分のファイルのみを検索して削除したければ、次のように入力する。
$ find /tmp -type f -user `whoami` -exec rm -f {} \;
このように入力すれば、コマンドを実行しているユーザが所有するファイルのみが削除

カレントディレクトリ以下を検索したければ、パスにピリオド(.)を使用
$ find . -cnewer somefile.txt
このコマンドを実行すると、somefile.txtよりも後に作成されたファイルがすべて一覧で表示される。

カレントディレクトリ以下にある過去30日間に変更されたファイルで、かつ文字列.svnが含まれていないものを探し、さらにそれらのファイルをlsコマンドで一覧表示したい場合。
$ find . -type f -ctime -30 -not -regex ‘.*svn.*’ -exec ls {} -al \;

関連する記事:

Leave a Reply