find

シェルスクリプトは、『シェルスクリプト (英語: shell script) は、オペレーティングシステムのシェルまたはコマンドラインインタプリタ向けに書かれたスクリプト言語である。』です。

  1. findコマンドの基本
    1. findコマンドの基本動作
  2. findコマンドの便利な判別式や演算子、アクションたち
    1. 判別式や演算子、アクションの一覧
      1. 判別式 -name
      2. 判別式 -atime
      3. 判別式 -mtime
      4. 判別式 -amin
      5. 判別式 -mmin
      6. 判別式 -anewer
      7. 判別式 -newer
      8. 判別式 -empty
      9. 判別式 -size
      10. 判別式 -type f
      11. 判別式 -type d
      12. 判別式 -perm
      13. 演算子 -and
      14. 演算子 -or
      15. 演算子 -not
      16. アクション -exec
    2. -name:ワイルドカードを使用して、ファイルやディレクトリ名の一部のみを指定し検索する
    3. -atime:任意の日数にアクセスされたファイルやディレクトリを検索する
    4. -mtime:任意の日数に更新されたファイルやディレクトリを検索する。
    5. -amin:任意の分数以前にアクセスされたファイルやディレクトリを検索する
    6. -mmin:任意の時間に更新されたファイルやディレクトリを検索する。
    7. -anewer:任意のファイルの更新日時よりも後にアクセスしたファイルやディレクトリを検索する。
    8. -newer:任意のファイルの更新日時よりも後に更新したファイルやディレクトリを検索する
    9. -empty:ファイルやディレクトリの容量がないものを検索する
    10. -size:ファイルの容量を指定し検索する
    11. -type f :ファイルのみを対象とし検索する
    12. -type d :ディレクトリを対象とし検索する
    13. -perm:パーミッションで検索する
    14. -and:複数の条件を使って、すべての条件に当てはまるファイルやディレクトリを検索する
    15. -or:複数の条件を使って、いずれかの条件に当てはまるファイルやディレクトリを検索する
    16. -not:条件に当てはまらないファイルやディレクトリを検索する
    17. -exec:検索結果に対してコマンドを実行する

findコマンドの基本

findコマンドの基本動作

findは、その通り検索のコマンドだ。ファイルやディレクトリを検索する。

基本的な書式は次のようになる。

$ find ファイル名

findに続き、検索するファイル名を指定する。

例えば、workディレクトリ内のtest01.datを検索する場合は、次のようになる。

$ find ./work/test01.dat

findコマンドの基本

workディレクトリ内のtest01.datが検索された。

上記findコマンドを試すなら下のコマンドをLinux上で実行すればすぐに再現可能だ。 touch ./work/test01.dat touch ./work/test02.dat touch ./work/test03.dat touch ./work/test04.dat touch ./work/sample01.dat touch ./work/sample02.dat ls -l ./work/ find ./work/test01.dat

12345678touch ./work/test01.dattouch ./work/test02.dattouch ./work/test03.dattouch ./work/test04.dattouch ./work/sample01.dattouch ./work/sample02.datls -l ./work/find ./work/test01.dat

検索するファイルがなければエラーが表示される。

workディレクトリ内のtest10.datは存在しないが、検索してみる。

$ find ./work/test10.dat

findコマンド エラー

「そのようなファイルやディレクトリはありません」とエラーが表示された。 ls -l ./work/ find ./work/test10.dat

12ls -l ./work/find ./work/test10.dat

findコマンドの便利な判別式や演算子、アクションたち

判別式や演算子、アクションの一覧

後から詳細をご紹介するが、まずは一覧で見てみよう。

判別式 -name

ワイルドカードを使用して、ファイルやディレクトリ名の一部のみ指定した検索ができる。

判別式 -atime

任意の日数にアクセスされたファイルやディレクトリを検索する。

判別式 -mtime

任意の日数に更新されたファイルやディレクトリを検索する。

判別式 -amin

任意の分数にアクセスされたファイルやディレクトリを検索する。

判別式 -mmin

任意の分数に更新されたファイルやディレクトリを検索する。

判別式 -anewer

任意のファイルの更新日時よりも後にアクセスしたファイルやディレクトリを検索する。

判別式 -newer

任意のファイルの更新日時よりも後に変更したファイルやディレクトリを検索する。

判別式 -empty

ファイル容量が0のファイルやディレクトリを対象とし検索する。

判別式 -size

ファイル容量を指定し検索する。

判別式 -type f

ファイルのみを対象とし検索する。

判別式 -type d

ディレクトリを対象とし検索する。

判別式 -perm

パーミッションで検索する。

演算子 -and

複数の条件を使って、すべての条件に当てはまるファイルやディレクトリを検索する。

演算子 -or

複数の条件を使って、いずれかの条件に当てはまるファイルやディレクトリを検索する。

演算子 -not

条件に当てはまらないファイルやディレクトリを検索する

アクション -exec

検索結果に対してコマンドを実行する。

かなり長くなってしまったが、それぞれ詳細を紹介していく。

-name:ワイルドカードを使用して、ファイルやディレクトリ名の一部のみを指定し検索する

ファイル名やディレクトリ名が一部しかわからない場合でもワイルドカードを使って検索できる。

ワイルドカードは直前に「\」でエスケープしないとエラーや想定した動作にならない。

$ find 検索先 -name ファイル名

workディレクトリ内の拡張子.datのファイルを検索する場合は、次のとおりだ。

$ find work -name \*.dat

find -nameオプション

拡張子.datのファイルのみ表示された。 ls -l ./work/ find work -name \*.dat

12ls -l ./work/find work -name \*.dat

-nameを記述せずに、

$ find ./work/ *.dat

と記述することで、同じ動作をすることもできる。

-atime:任意の日数にアクセスされたファイルやディレクトリを検索する

指定した日にアクセスしたファイルやディレクトリを検索できる判別式だ。

日数は、今日が0、昨日が1である。

$ find 検索先 -atime 日数

今日アクセスしたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -atime 0

find -atimeオプション

今日アクセスされたファイルが表示された。 rm ./work/* touch ./work/test01.dat touch -a -d “-2day” ./work/test02.dat touch -m -d “-7day” ./work/test02.dat touch -a -d “-3day” ./work/test03.dat touch -m -d “-30day” ./work/test03.dat touch -a -d “-4day” ./work/test04.dat touch -m -d “-30day” ./work/test04.dat ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -atime 0

12345678910rm ./work/*touch ./work/test01.dattouch -a -d “-2day” ./work/test02.dattouch -m -d “-7day” ./work/test02.dattouch -a -d “-3day” ./work/test03.dattouch -m -d “-30day” ./work/test03.dattouch -a -d “-4day” ./work/test04.dattouch -m -d “-30day” ./work/test04.datls -lu ./work/ #最終アクセス日時を表示find ./work/ -atime 0

任意の日数以内にアクセスされたファイルやディレクトリをすべて表示したい場合は、日数に-を付ける。

3日以内にアクセスされたファイルやディレクトリを検索する場合は、次のとおりだ。

$ find ./work/ -atime -3

find -atimeオプション 2

今日から3日以内にアクセスされたファイルが表示された。 ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -atime -3

12ls -lu ./work/ #最終アクセス日時を表示find ./work/ -atime -3

任意の日数前までにアクセスされたファイルやディレクトリをすべて表示したい場合は、日数に+を付ける。

3日よりも前にアクセスされたファイルやディレクトリを検索する場合は、次のとおりだ。

$ find ./work/ -atime +3

find -atime 3

今日から3日よりも前にアクセスされたファイルが表示された。 ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -atime +3

12ls -lu ./work/ #最終アクセス日時を表示find ./work/ -atime +3

-mtime:任意の日数に更新されたファイルやディレクトリを検索する。

指定した日に変更を行ったファイルやディレクトリを検索できる判別式だ。

日数は、今日が0、昨日が1である。

$ find -mtime 日数

今日変更を行ったファイルを検索する場合は、次のとおりだ。

$ find -mtime 0

find -mtimeオプション

今日変更されたファイルが表示された。 ls -l ./work/ #最終変更日時を表示 find ./work/ -mtime 0

12ls -l ./work/ #最終変更日時を表示find ./work/ -mtime 0

任意の日数以内に変更を行ったファイルをすべて表示したい場合は、日数に-を付ける。

10日以内に変更されたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -mtime -10

find -mtimeオプション 2

10日以内に変更されたファイルが表示された。 ls -l ./work/ #最終変更日時を表示 find ./work/ -mtime -10

12ls -l ./work/ #最終変更日時を表示find ./work/ -mtime -10

任意の日数前までに変更を行ったファイルをすべて表示したい場合は、日数に+を付ける。

20日よりも前に変更されたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -mtime +20

find -mtimeオプション3

20日より前に変更されたファイルが表示された。 ls -l ./work/ #最終変更日時を表示 find ./work/ -mtime +20

12ls -l ./work/ #最終変更日時を表示find ./work/ -mtime +20

-amin:任意の分数以前にアクセスされたファイルやディレクトリを検索する

指定した時間にアクセスしたファイルやディレクトリを検索できる判別式だ。

$ find 検索先 -amin 分数

直前にアクセスしたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -amin 1

find -aminオプション

直前にアクセスされたファイルが表示された。 rm ./work/* touch ./work/test01.dat touch -a -d “-15min” ./work/test02.dat touch -m -d “-600min” ./work/test02.dat touch -a -d “-20min” ./work/test03.dat touch -m -d “-3600min” ./work/test03.dat touch -a -d “-30min” ./work/test04.dat touch -m -d “-3600min” ./work/test04.dat ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -amin 1

12345678910rm ./work/*touch ./work/test01.dattouch -a -d “-15min” ./work/test02.dattouch -m -d “-600min” ./work/test02.dattouch -a -d “-20min” ./work/test03.dattouch -m -d “-3600min” ./work/test03.dattouch -a -d “-30min” ./work/test04.dattouch -m -d “-3600min” ./work/test04.datls -lu ./work/ #最終アクセス日時を表示find ./work/ -amin 1

任意の時間以内にアクセスされたファイルをすべて表示したい場合は、分に-を付ける。

25分以内にアクセスされたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -amin -25

find -aminオプション

今から25分以内にアクセスされたファイルが表示された。 ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -amin -25

12ls -lu ./work/ #最終アクセス日時を表示find ./work/ -amin -25

任意の時間の前までにアクセスされたファイルをすべて表示したい場合は、分に+を付ける。

25分よりも前にアクセスされたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -amin +25

find -aminオプション

今から25分よりも前にアクセスされたファイルが表示された。 ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -amin +25

12ls -lu ./work/ #最終アクセス日時を表示find ./work/ -amin +25

-mmin:任意の時間に更新されたファイルやディレクトリを検索する。

指定した時間に変更を行ったファイルの場所を検索できる判別式だ。

$ find -mtime 分数

今変更を行ったファイルを検索する場合は、次のとおりだ。

$ find -mmin 1

find -mminオプション

今変更されたファイルが表示された。 ls -l ./work/ #最終更新日時を表示 find ./work/ -mmin 1

12ls -l ./work/ #最終更新日時を表示find ./work/ -mmin 1

任意の時間までに変更を行ったファイルをすべて表示したい場合は、分数に-を付ける。

12時間以内に変更されたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -mmin -720

find -mminオプション

12時間(720分)以内に変更されたファイルが表示された。 ls -l ./work/ #最終更新日時を表示 find ./work/ -mmin -720

12ls -l ./work/ #最終更新日時を表示find ./work/ -mmin -720

任意の時間までに変更を行ったファイルをすべて表示したい場合は、分数に+を付ける。

20時間よりも前に変更されたファイルを検索する場合は、次のとおりだ。

$ find ./work/ -mmin +1200

find -mminオプション 3

20時間(1200分)より前に変更されたファイルが表示された。 ls -l ./work/ #最終更新日時を表示 find ./work/ -mmin +1200

12ls -l ./work/ #最終更新日時を表示find ./work/ -mmin +1200

-anewer:任意のファイルの更新日時よりも後にアクセスしたファイルやディレクトリを検索する。

あるファイルの更新日時と比べて、アクセスした時間がそれ以降のファイルを検索する。

$ find 検査元 -anewer 元ファイル名

workディレクトリ内のtest02.datの変更日時よりも後にアクセスしたworkディレクトリ内のファイルを検索する場合は、次のとおりだ。

$ find ./work/ -anewer ./work/test02.dat

find -anewerオプション

rm ./work/* touch ./work/test01.dat touch -a -d “-15min” ./work/test02.dat touch -m -d “-25min” ./work/test02.dat touch -a -d “-20min” ./work/test03.dat touch -m -d “-30min” ./work/test03.dat touch -a -d “-30min” ./work/test04.dat touch -m -d “-40min” ./work/test04.dat ls -lu ./work/ #最終アクセス日時を表示 find ./work/ -anewer ./work/test02.dat

12345678910rm ./work/*touch ./work/test01.dattouch -a -d “-15min” ./work/test02.dattouch -m -d “-25min” ./work/test02.dattouch -a -d “-20min” ./work/test03.dattouch -m -d “-30min” ./work/test03.dattouch -a -d “-30min” ./work/test04.dattouch -m -d “-40min” ./work/test04.datls -lu ./work/ #最終アクセス日時を表示find ./work/ -anewer ./work/test02.dat

-newer:任意のファイルの更新日時よりも後に更新したファイルやディレクトリを検索する

あるファイルの更新日時と比べて、更新した時間がそれ以降のファイルを検索する。

$ find 検査元 -newer 元ファイル名

workディレクトリ内のtest03.datの変更日時よりも後に更新したworkディレクトリ内のファイルを検索する場合は、次のとおりだ。

$ find ./work/ -newer ./work/test03.dat

find -newerオプション

ls -l ./work/ #最終更新日時を表示 find ./work/ -newer ./work/test03.dat

12ls -l ./work/ #最終更新日時を表示find ./work/ -newer ./work/test03.dat

-empty:ファイルやディレクトリの容量がないものを検索する

空のものを検索する判別式だ。

$ find 検査元 -empty

workディレクトリ内のファイル容量が0のものを検索する場合は、次のとおりだ。

$ find ./work/ -empty

find -empty

echo TEST > ./work/test01.dat echo TEST01 > ./work/test02.dat ls -la ./work/ find ./work/ -empty

1234echo TEST > ./work/test01.datecho TEST01 > ./work/test02.datls -la ./work/find ./work/ -empty

-size:ファイルの容量を指定し検索する

ファイルの容量を指定して検索する判別式だ。

初期設定では、ファイル容量が指定したものを検索する。

指定したファイル容量以上のものを検索する場合はファイル容量の前に+を、以下の場合はマイナスを付与する。

ファイル容量の後ろにcを付与すると単位がByteとなり、kを付与するとkByteとなる。

$ find 検索元 -size ファイル容量

workディレクトリ内のファイル容量が6byte以下のファイルを検索する場合は、次のとおりだ。

$ find ./work/ -size -6c

find -sizeオプション

find ./work/ -size -6c

1find ./work/ -size -6c

-type f :ファイルのみを対象とし検索する

検索対象をファイルのみに限定して検索する判別式だ。検索対象のタイプに「file」を指定する形になる。

$ find ファイル名 -type f

workディレクトリ内のファイル名に01が含まれるファイルのみを検索する場合は、次のとおりだ。

$ find ./work/*01* -type f

find -type fオプション

mkdir ./work/Dir01 mkdir ./work/Dir02 ls -l ./work/ find ./work/*01* -type f

1234mkdir ./work/Dir01mkdir ./work/Dir02ls -l ./work/find ./work/*01* -type f

-type d :ディレクトリを対象とし検索する

上の「-type f」と同じパターンだ。dを指定することで、検索対象をディレクトリのみに限定して検索する判別式になる。

$ find ディレクトリ名 -type d

workディレクトリ内のディレクトリ名に01が含まれるディレクトリのみを検索する場合は、次のとおりだ。

$ find ./work/*01* -type d

find -type d オプション

ls -l ./work/ find ./work/*01* -type d

12ls -l ./work/find ./work/*01* -type d

-perm:パーミッションで検索する

ある特定のパーミッションで検索する判別式だ。

$ find 検索元 -perm パーミッション

または

$ find 検索元 -perm -対象者=アクセス権

対象者は、所有者がu、グループがg、その他のユーザーがo、全対象者がaとなる。

アクセス権は、読み込み権限がr、書き込み権限がw、実行権限がxとなる。

workディレクトリ内のパーミッションが664を検索する場合は、次のとおりだ。

$ find ./work/ -perm 664

find -permオプション

アクセス権限が664(-rw-rw-r–)のものが検索された。 chmod 766 ./work/test01.dat ls -l ./work/ find ./work/ -perm 664

123chmod 766 ./work/test01.datls -l ./work/find ./work/ -perm 664

workディレクトリ内の所有者が実行権限を持つものを検索する場合は、次のとおりだ。

$ find ./work/ -u=x

find -permオプション

所有者に実行権限が設定されている(アクセス権限が-rwxrw-rw-)のものが検索された。 ls -l ./work/ find ./work/ -perm -u=x

12ls -l ./work/find ./work/ -perm -u=x

-and:複数の条件を使って、すべての条件に当てはまるファイルやディレクトリを検索する

複数の検索条件を使って、すべての条件が満たしているファイルやディレクトリのみを検索する演算子だ。

$ find 検索元 検索条件1 -and 検索条件2

workディレクトリ内の名称に2が入っていて、なおかつパーミッションが664のものを検索する場合は、次のとおりだ。

$ find ./work/ -name \*2\* -and -perm 664

find -andオプション

ファイル名称に2が入っていて、なおかつ、アクセス権限が664(-rw-rw-r–)のものが検索された。 ls -l ./work/ find ./work/ -name \*2\* -and -perm 664

12ls -l ./work/find ./work/ -name \*2\* -and -perm 664

-or:複数の条件を使って、いずれかの条件に当てはまるファイルやディレクトリを検索する

複数の検索条件を使って、いずれかの条件を満たしているファイルやディレクトリを検索する演算子だ。

$ find 検索元 検索条件1 -or 検索条件2

workディレクトリ内の名称に4が入っている、またはパーミッションが766のものを検索する場合は、次のとおりだ。

$ find ./work/ -name \*4\* -or -perm 766

find -orオプション

ファイル名称に4が入っている、または、アクセス権限が766(-rwxrw-rw-)のものが検索された。 ls -l ./work/ find ./work/ -name \*4\* -or -perm 766

12ls -l ./work/find ./work/ -name \*4\* -or -perm 766

-not:条件に当てはまらないファイルやディレクトリを検索する

検索条件に当てはまらないファイルやディレクトリを検索する演算子だ。

$ find -not 検索元 検索条件

workディレクトリ内の所有者に実行権限のないものを検索する場合は、次のとおりだ。

$ find ./work/ -not -perm -u=x

find -notオプション

workディレクトリ内の所有者に実行権限があるものは検索されず、それ以外が検索された。 ls -l ./work/ find ./work/ -not -perm -u=x

12ls -l ./work/find ./work/ -not -perm -u=x

-exec:検索結果に対してコマンドを実行する

検索した結果に対して、何らかのアクションを自動で実行させることができるものだ。

$ find 検索元 検索ファイル名 -exec 実行するコマンド \;

workディレクトリ内の拡張子.datを探し、圧縮ファイルtest.zipに追加していく場合は、次のとおりだ。

*は\でエスケープする。また、対象となる全ファイルという意味で{}を記述している。

$ find ./work/ -name \*.dat -exec zip ./work/test.zip {}  \;

find -execオプション

workディレクトリ内の拡張子.datのファイルがtest.zipに次々と圧縮されている。 find ./work/ -name \*.dat -exec zip ./work/test.zip {}  \; ls -l ./work/

12find ./work/ -name \*.dat -exec zip ./work/test.zip {}  \;ls -l ./work/

workディレクトリ内のパーミッションが644のものを探し、パーミッションを666に変更する場合は、次のとおりだ。

$ find ./work/ -perm 664 -exec chmod 666 {}  \;

find -execオプション

workディレクトリ内のパーミッションが644のファイルのパーミッションが666に変更された。 ls -l ./work/ find ./work/ -perm 664 -exec chmod 666 {}  \; ls -l ./work/

123ls -l ./work/find ./work/ -perm 664 -exec chmod 666 {}  \;ls -l ./work/


タイトルとURLをコピーしました