カテゴリー
Linux

🔍 find コマンドの便利な使い方メモ

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 のアクションを使う方が好みです。

以上です。

コメントを残す