tuuuuuuken’s blog

主にIT関係のメモ書きを残していきます。たまに趣味のことも

mac環境でfindとxargsを使う時は-print0と-0を必ずつける(戒め

内容はタイトル通りです。

macで定期的にディレクトリ内のファイルを削除するcronを登録しようとした際に、xargsコマンドの--no-run-if-emptyが無いみたいだからどうしようかと検索してたところ以下のブログを発見。

http://www.otsune.com/diary/2007/03/29/1.html

Mac OSの場合はディレクトリ名及びファイル名に空白(0x20)を入れることができるため、find及びxargsの区切り文字を、デフォルトの空白のままにしておくと想定外のフォルダやファイルを処理してしまうみたい。

例えば、こういうディレクトリがあったとして

~/w/hoge ❯❯❯ tree
.
├── a
├── a\ b
└── b

3 directories, 0 files

a bディレクトリを削除するために以下のコマンドを実行するとする

~/w/hoge ❯❯❯ find . -name 'a b'
./a b

find . -name 'a b' | xargs rm -rf

a bディレクトリが削除され、aディレクトリとbディレクトリはそのままになってて欲しいが、結果は以下のようにaディレクトリとbディレクトリが削除されてしまう。

~/w/hoge ❯❯❯ tree
.
└── a\ b

1 directory, 0 files

対策としては、タイトルにも書いてあるとおりfindコマンドの-print0及びxargsに-0をつけることで対処できる。

~/w/hoge ❯❯❯ tree
.
├── a
├── a\ b
└── b

3 directories, 0 files

~/w/hoge ❯❯❯ find . -name 'a b' -print0
./a b%      

~/w/hoge ❯❯❯ find . -name 'a b' -print0 | xargs -0 rm -rf

~/w/hoge ❯❯❯ tree
.
├── a
└── b

2 directories, 0 files