- 中本光
- 約 2,000 文字
- 17,800 View
目次
Photo by Agence Olloweb on Unsplash
はじめに
こんにちは、中本です。シェルスクリプト連載の3日目です。
本記事ではShell Script作成において切っても切れない findコマンド について利用頻度高めのオプションをまとめます。
最後には今回紹介したオプションを全て盛り込んだシェルスクリプトを作成します。
findとは
findは、場所を指定してファイルやディレクトリを検索するコマンドです。
「ファイル名/ディレクトリ名」「更新日時」「種別」など様々な条件を指定してファイルを検索できます。
様々なfindオプション
-typeオプション
検索する対象のファイル種別を指定するオプション
検索対象種別「ファイル」 |
ls -l |
‐nameオプション
検索する対象の検索文字列を指定するオプション
ワイルドカードを使用することで、部分一致のファイルやディレクトリの検索が可能となります。
検索対象種別「ファイル」 |
ワイルドカード無しだと完全一致検索 |
なお、-pathも同様に検索文字列を指定するオプション-nameと異なり、「/」を含む文字列検索が可能です。
ls -l ./dir1/ |
-mtime/-mminオプション
ファイルやディレクトリのタイムスタンプから判定して、検索対象期間を指定するオプション。
|
上記のように「+」や「‐」を付与することで検索対象期間をより特定期間に絞ることが可能となります(※対象期間については後述)。
日数は今日が「0」で、昨日が「1」と換算します。
ls -l ./ |
また、オプション無しの状態ではコマンド実行時点を起点として、日数計算しますが、-daystartオプションを付与することで当日24:00を起点として日数計算します。
(ジョブ処理等で、コマンド実行時間によって処理にばらつきを生じさせたくない際などに利用推奨)
他にも、-mtimeではなく、‐mminも存在し、分単位で指定もできます。
-mtime と -mmin はfindを利用する上で高頻度で利用されるオプションですが、対象となる期間がややこしいので、以下のように整理してみました。
注意点としては、-daystartオプションは日の始まりである0:00ではなく、日の終わりの24:00を起点としていること注意が必要です。
そのため-mtime -0は必ず未来日検索となるため、基本的にファイル検索結果は存在しません。
-depthオプション
検索対象ディレクトリの階層を指定するオプション。
本オプションを指定しない場合、子ディレクトリ全てに対して検索します。
ファイル数が膨大にあり、検索対象のディレクトリ階層を絞りたい時などに有効です。
検索する最大深度の階層 |
tree ./find_test1 |
‐execオプション
コマンド実行結果を引数として次の処理に引き渡す場合などに利用されます。
同様の動きを持つコマンドとしてxargsがあります。
findで検索した結果のみをlsに引き渡す |
一見すると、xargsも-execも同様の処理結果を返すように見えるのですが、
find . -type f -name "*.txt" -exec echo "ファイル名: {}" \; |
上記の挙動で分かるように、以下のように処理に違いがあります。
| 処理 | 説明 |
|---|---|
| -execオプション | 実行結果を1行ずつ引き渡して処理する |
| xargsコマンド | 実行結果をまとめて引き渡して処理する |
したがって、検索したファイルを1ファイル単位で圧縮するなどの処理の場合は、-execオプションを利用が推奨されます。
while read line
while read lineに関しては、findのオプションではありませんが、findコマンドと相性の良いループ処理です。
検索結果を一行ずつ読み込んで、任意の処理を実行できます。
|
bash ./while_read_line.sh |
while read line はもちろんfindのみではなく、
cat {ファイル名} |while read lineecho {変数} |while read line
といった形でも利用可能です。
おまけ
先で紹介したオプションを盛り込んで、
【-mtime】前日以前に更新されたファイル |
処理を行うシェルスクリプトを作成してみます。
|
| # | 処理概要 |
|---|---|
| 1 | 検索対象種別は「ファイル」を対象として検索する |
| 2 | 「bbb」という文字列を含むファイルのみ対象として検索する |
| 3 | 前日以前のファイルを対象として検索する |
| 4 | 指定ディレクトリから子ディレクトリ2階層までを対象として検索する |
| 5 | 各ファイル内容の「bbb」という特定文字列の直後に任意行を挿入する |
| 6 | ファイル単位で元ファイルと同ディレクトリ内に圧縮ファイルを作成する |
| 7 | 圧縮が成功していれば、ファイルは削除する |
処理イメージ
スクリプト実行前 |
想定通りの挙動をするシェルスクリプトになりました。
おわりに
findは利用頻度は非常に高いのですが、-mtime/-mminといった対象期間を限定する起点や終点についてよく迷ってしまうので、そんなときに本記事がお役に立てれば幸いかと思います。
また、今回紹介しきれませんでしたが、-atime/-ctime/-newerなど他にも様々なfindオプションがありますので、もっともっとオプションを使いこなして素敵なfindライフを送りましょう。
シェルスクリプト連載の3日目でした。明日は市川諒さんのdeclare使ってBashで配列と連想配列です。
