コマンド_find そしてちょっとxargs

Linux
ブログ

findとは

ファイルを検索するコマンド。( find [オプション] [パス][評価式] )

評価式(時間)

+ 数値数値を起点として、より過去を示す
- 数値数値を起点として、より現在に近いほうを示す
-aminファイルへのアクセス時間(分)-amin 30
30分より前にアクセスされたファイル
-cminファイルの更新時間(分)
    (作成)
-cmin +40
40分より前に更新されたファイル
-atimeファイルへのアクセス時間(日)-atime -30
30日以内にアクセスされたファイル
-ctimeファイルの更新時間(日)
     (作成)
-ctime +365
365日より前に作成されたファイル

評価式(その他)

-name 文字列指定した文字列がディレクトリ名以外の部分にマッチする
-iname 文字列指定した文字列の大文字小文字を区別しない
-size 数値指定したサイズよりも大きいサイズを検索+100k 100kB超える
-10G 10GB未満(※)
-type ファイルタイプ指定したファイルタイプを検索b ブロックファイル
d ディレクトリ
f ファイル
l シンボリックリンク
s ソケットファイル
-userファイルの所有するユーザを示す
-groupファイルを所有するグループを示す
(※)-size -1k (-1M,-1G)には要注意。これでは何も表示されない(指定した単位に丸められて1未満に該当しなくなるため)

アクション

-name ファイル名ファイル名を指定して検索
-exec コマンドコマンドを実行-exec コマンド {} \;
-fprint ファイル名検索されたファイルのフルパスを「ファイル名」に出力
-print検索したファイル名のフルパスを改行文字をつけて出力
-print0検索したファイル名のフルパスを表示して、
        最後にヌル文字をつける。
-and (-a)検索条件「かつ」
-or (-o)検索条件「または」
「\」はバックスラッシュ

例えば

ファイル名を指定して検索	
  find / -name example.txt	

カレントディレクトリにある1日以内に修正した.exeの拡張子のファイル一覧検索	
  find ./ -name *.txt -type f -mtime 1 	

カレントディレクトリ以下にある30日を超えてアクセスされていないファイルを検索し、削除	
  find -atime +30 -type f -exec rm {} \;  
  もしくは find -atime +30 -type f | xargs rm	

/var/www/blog内にあるファイルすべてにパーミッション「実行」を付加する	
  find /var/www/blog -type f -print0 | xargs -0 sudo chmod a-x
	
カレントディレクトリ内の直近1週間内に変更された、名前が「.exe」で終わるファイルの検索	
  find ./ -ctime -8 -and -name *.exe	

カレントディレクトリ内にある30日を超え60日以内に変更された、
                   名前にlistまたはendを含むファイル	
  find ./ -ctime +30 -and -ctime 60 -and \( -name *list* -or -name *end* \)

xargsとは

標準入力から受け取った文字列を引数に指定して、コマンドを実行する

100日を超える日数の間更新されていないファイルを削除するには
  find . -mtime +100 -type f | xargs rm
    とします。ただしこれは
  find . -mtime +100 -type f -exec rm {} \;
    と同じです。

※「-exec」は引数が多すぎるとシェルの制限を超過して処理できない場合がある。「xargs」はそれでも処理できます。

-0入力を空白や改行ではなくNULL文字で区切る
-a ファイル標準入力の代わりにファイルから項目を読み込む

メモ:ファイル名やディレクトリ名にスペースがあると、スペースが区切り文字と認識されてエラーになることがある。そのようなときは、findコマンドで「-print0(ゼロ)」オプションを使い、xargコマンドで「-0(ゼロ)」オプションを使うと、ヌル文字が区切り文字として使用することができる。(日経Linux2023年3月号P40)

参考文献

コメント