findに関する世界観です。
findはファイル名を検索したり、ツリー構造のファイル一覧を出力したりするコマンド。
特にオプションを使ってたとえば更新日時の新しいファイルを探したり、xargsを用いてgrepやsedをかける前のファイル一覧の出力(パイプでxargsに送る)などに使える。
$ find /usr/src/linux | less
2024.02.08編集
findはファイルを検索する際、色んなオプションが使える。locateはオプションは貧弱だが、事前に作られたデータベースから検索するために、検索速度が速い。
データベースはcronで自動で作られるが、手動で作る場合はrootユーザーになってupdatedbを実行する。
後日注記:locateは、findのようにさまざまな条件を指定して検索することはできないが、データベースを用いるため、超高速にファイルを検索できる。
オプション | 意味 |
---|---|
-name | ファイル名を指定(大文字小文字を区別する) |
-iname | ファイル名を指定(大文字小文字を区別しない) |
-atime | アクセス日時を指定 |
-mtime | 更新日時を指定 |
-size | サイズを指定 |
-type | ファイルの種別を指定 fはファイルのみ dはディレクトリのみ |
-perm | パーミッションを指定 |
-and | 複数の条件を指定(AND) |
-or | 複数の条件を指定(OR) |
-not | 条件に当てはまらないものを検索(NOT) |
詳しくは以下のページが参考になります。
findの便利な使い方。カレントディレクトリ(.)から「最近7日以内」に更新されたファイルを見つける。
$ find . -mtime -7
ls -lのように詳細に表示したい場合は-lsをつける。
以下は引用元。
xargsは、すべての行をそれぞれ引数とするような順次的なコマンド操作を行うコマンド。
xargsを上手く使うことで、一覧されたテキストから全てに対するコマンドを実行できる。findとともに使うことで、手作業でうんざりする作業をしなくても済む。
xargsコマンドを上手く使うことで、findやgrepなどの結果から、「全ての行に対するコマンド」を実行出来る。
xargsは、たとえば、findで一覧した全てのファイルに対して、sedのようなコマンドで正規表現をかけ、保存したい場合などに使える。
xargsで全てのHTMLファイルを正規表現で置換する。
find . -name '*.html' | xargs sed -i 's/Linux/FreeBSD/g'
以下は引用元。
同様のことをWindowsで行うためには、フリーソフトのサクラエディタのGrepやGrep検索機能を使う。あるいはxyzzyなどでも同じ機能がある。
GNU parallelはコマンドを並列実行するツール。簡単な並列実行ならxargsに-Pオプションでもいける。
findやxargsと組み合わせることができるのはsedだけではありません。awkやPerl、あるいはbashなどと組み合わせることも可能です。
たとえば、すべての*.txtファイルに同じスクリプトを適用するような方法が考えられます。要するにバッチ処理です。findとxargsでバッチ処理の練習ができます。
ほかにも、もっと普通のUNIXコマンド(たとえばmvやcpやkillなど)をxargsと組み合わせることもできます。以下はその例です。
2024.05.22
また、「大切な環境が壊れるかもしれないからバッチ処理なんかしたくない」という人は、最近は仮想マシンという優れ物があります。
すなわち、壊れるかもしれないことは仮想マシンで試し、システムが壊れた時は仮想マシンごと瞬時に消して、また新しい仮想マシンを作れます。
なので、そのような仮想マシンを使って、壊れるかもしれない時は壊れてもいい環境で行いましょう。
後日注記:実際にはテスト用の仮想マシンをわざわざ作らなくても、一時的なディレクトリに処理するデータをコピーするなどすれば、比較的安全にテストを行うことができます。もしいきなり本番のデータを使うなら、それなりのバックアップや復旧のための体制(たとえばgitのようなバージョン管理システムを使うとか、tarで元のデータのアーカイブを取っておくなど)は取っておきましょう。
DockerやBash(シェルスクリプト)も参照のこと。
2024.05.22
2024.05.25編集