find コマンドの使い方への理解
find ディレクトリ 絞り込み条件 アクション
- ディレクトリ: find の対象。再起的。
- 絞り込み条件: どんな名前なのか、ファイルなのか、どの期間なのか
- アクション: 絞り込まれたファイルに対して何をするのか
- 他に大事だと思うこと
- オプションは
find
とディレクトリ
の間に配置する。 絞り込み条件
アクション
はオプションではない。絞り込み条件
アクション
はfind path [expression]
の[expression]
に該当する。
- オプションは
便利な使い方。指定のディレクトリから再帰的に文字列を置換する
「Linuxで指定のディレクトリから再帰的に文字列を置換するコマンドを教えて」と生成AIに相談し、得られた答えを元にググったりして次のやり方で調査、確認、実行を良い感じにできるようになりました♪
# 置換対象の文字列と置換後の文字列を変数として定義
OLD_STRING='http://example.com/xxx/yyy'
NEW_STRING='https://example.org/aaa/'
# 確認
find /path/to/target -type f -exec grep -l "$OLD_STRING" {} +
# 実行
find /path/to/target -type f -exec sed -i "s|$OLD_STRING|$NEW_STRING|g" {} +
参考
便利な使い方に至るヒント。一定期間過ぎた sql ファイルを削除するコマンドをリファクタリングする
find
で得られたリストのファイルを削除することがありました。特に深い理由もなく調べてヒットしたからというだけで xargs
を使っていたのですが、 find
のアクションとして -delete
というものがあることを知りました。
find
でもともとカバーしているのであれば、それを使う方がよかろうということで、その方向性でリファクタリングしました。
以下は、リファクタ前後、動作確認です。私の -mtime
の理解はまだ怪しいのですけれども、今回そこは本質ではないので、その点はテキトーです。
# 一定期間過ぎた sql ファイルを削除するコマンド
# リファクタリング対象
find ./dump/*.sql -type f -daystart -mtime +7 | xargs rm -rf
# リファクタリング後
# [path...] に指定するのはファイルではなくディレクトリとするのが一般的
# [expression] に指定する絞り込み条件。 `-type f` でファイルのみに絞り込み、
`-name '*.sql'` でファイル名を絞り込む
# アクションとして `-delete` を指定することで削除する。削除するアクションがもともと `find` コマンドにあるので `xargs` は不要。
find ./dump/ -type f -name '*.sql' -daystart -mtime +7 -delete
# 確認
touch -d "7 days ago" ./dump/test7.sql
touch -d "8 days ago" ./dump/test8.sql
ls -la dump
find ./dump/ -type f -name '*.sql' -daystart -mtime +7
find ./dump/ -type f -name '*.sql' -daystart -mtime +7 -delete
# 参考
# findコマンドの使い方を簡単に理解するための7つのルール+実践的な知識 #Linux
- Qiita https://qiita.com/ko1nksm/items/7fec71f78a394a80ed2b
# man find (1): ディレクトリ階層をたどって、条件を満たすファイルを検索する
https://ja.manpages.org/find
参考
思いつき。
xargs
で繋げる必要があるケースって、ほとんどないのでは?思いつかない。。。といいつつ、実際にはいろいろあるのだろうな。
おわりに
man find
すると、 find – walk a file hierarchy
と冒頭にありました。
検索ではあるのだけれども、絞り込んだものに対してちょっとしたことをする、それが “walk” 部分だと思うのですけれども、のが find
なんだと考えました。
つまり、「検索」とだけ覚えてしまうと、検索結果に対してパイプで繋いで xargs
する、という行動になります。一方で、「ちょっとしたこともする」と覚えると、アクションとして削除したり指定のコマンドを実行したり、を組み込めるのだと考えます。
どちらも正解だと思います。私はパイプではなく find
のアクションを使う方が好みです。
以上です。