下級エンジニアの綴

新しく発見したことを綴っていこうと思っています。夢はでっかく上級エンジニアになることです。

linuxのfind -mtimeの挙動で失敗したのでメモ

今回はlinuxのfindコマンドのmtimeオプションで失敗したのでメモするために書きました。

今回失敗したこととしては、ファイルの削除cronを回しているときにfindコマンドを使って-mtimeオプションで時間を指定して削除処理をおこなっていました。 しかし、消しては行けないフォルダまで消してしまったので色んな問題が発生しました。

本題

  • これが初期状態です。
[vagrant@localhost test]$ ll -a memo/
total 8
drwxrwxr-x 2 vagrant vagrant 4096 Feb  2  2002 .
drwxrwxr-x 3 vagrant vagrant 4096 Jan 14 18:50 ..
-rw-rw-r-- 1 vagrant vagrant    0 Jan 14 18:45 aaaa.txt
-rw-rw-r-- 1 vagrant vagrant    0 Jan 14 18:45 bbb.txt
  • 削除処理を実行
[vagrant@localhost test]$ find memo/ -mtime -1 | xargs rm -rf
  • 削除結果
[vagrant@localhost test]$ ls -a memo/
.  ..

ここまでは想定通りの結果だったので問題なかったのですが、問題は次の処理になります。

[vagrant@localhost test]$ ls -a memo/
.  ..
[vagrant@localhost test]$ ll -a
total 12
drwxrwxr-x  3 vagrant vagrant 4096 Jan 14 19:05 .
drwx------. 5 vagrant vagrant 4096 Jan 14 18:50 ..
drwxrwxr-x  2 vagrant vagrant 4096 Feb  2  2002 memo
  • memoフォルダが空になっている状態で下記の処理を実行すると
[vagrant@localhost test]$ find memo/ -mtime -1 | xargs rm -rf
[vagrant@localhost test]$ ll -a
total 8
drwxrwxr-x  2 vagrant vagrant 4096 Jan 14 19:01 .
drwx------. 5 vagrant vagrant 4096 Jan 14 18:50 ..

なんと!!! memoフォルダまで消えてしまいました・・・・orz

補足

補足ですが上記のケースを回避するには

フォルダを指定するときに*を指定してやれば・・・

[vagrant@localhost test]$ find memo/* -mtime -1 | xargs rm -rf
find: `memo/*': No such file or directory
[vagrant@localhost test]$ ll -a
total 12
drwxrwxr-x  3 vagrant vagrant 4096 Jan 14 19:05 .
drwx------. 5 vagrant vagrant 4096 Jan 14 18:50 ..
drwxrwxr-x  2 vagrant vagrant 4096 Feb  2  2002 memo

この通りフォルダは削除されずに済みます!

いやー、知らない事がいっぱいあると再度実感したました。