パスに半角スペースが含まれるfindの結果をgrepしてxargsで削除する方法

# 結論
```bash:パスに半角スペースが含まれるファイルをfindして任意の文字でgrepして一括削除する
$ find {ディレクトリ} -type f | grep -i {ファイル名の一部} | sed -e 's/ /\\ /g' | xargs rm
```

# Macのディレクトリには半角スペースが含まれたものがあります
```bash
$ cd ~
$ find Library/ -maxdepth 1 -type d | grep " "
Library//Application Support
Library//Autosave Information
Library//Saved Application State
Library//Address Book Plug-Ins
Library//PDF Services
Library//Application Scripts
Library//Keyboard Layouts
Library//Internet Plug-Ins
Library//Mobile Documents
Library//Group Containers
Library//Fonts Disabled
Library//Screen Savers
Library//Input Methods
Library//Mobile Documents.1780041924
```

# スペースを含むディレクトリからファイル名で`grep`したりします
```bash
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode
Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl
Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2
```

# そのgrepしたファイルを削除したいです
## 試行錯誤する
### 工夫をしないで`xarg`を使うと半角スペースでパスが分断されてうまくいきません
```bash
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode | xargs rm
rm: Library/Application: No such file or directory
rm: Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl: No such file or directory
rm: Library/Application: No such file or directory
rm: Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2: No such file or directory
```

## `find`に`--print0`を付けてみてもうまくいきません
- 参考:[備忘録: [unix] スペースを含むファイル名をfindとxargsで使う方法](http://sea-otter-factory.blogspot.com/2008/07/unix-xargs.html)

```bash:manの説明
-print  This primary always evaluates to true.  It prints the pathname of the current file to standard output.  If none of -exec, -ls,
     -print, -print0, or -ok is specified, the given expression shall be effectively replaced by ( given expression ) -print.
```

```bash
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f -print0 | grep -i xcode | xargs rm
rm: Binary: No such file or directory
rm: file: No such file or directory
rm: (standard: No such file or directory
rm: input): No such file or directory
rm: matches: No such file or directory

$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f -print0 | grep -i xcode
Binary file (standard input) matches
```

#### 更に`grep`に`xargs -0`をつけてみたらファイル名での`grep`ではなくなった
```bash
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f -print0 | xargs -0 grep -i xcode
Binary file Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl matches
Binary file Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2 matches
# ↓このファイルは削除対象にしたくない
Binary file Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.RecentApplications.sfl2 matche

$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | xargs -0 grep -i xcode
grep: Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.RecentApplications.sfl
Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.RecentDocuments.sfl2
# 省略：削除対象にしたくないファイルがいっぱい
: File name too long
```

### `xargs`に`-I`をつけてダブルクォーテーションで囲ってみたがうまくいかない
`-print0`とか`-0`を止めて`xargs`で置き換えをやってみる

- 参考
    - [半角スペースを含むファイル名をxargsで処理するメモ](https://7me.oji.0j0.jp/2017/xargs-ls-whitespace.html)
    - [xargsで、引数を任意の場所に埋め込む - 揮発性のメモ２](https://iww.hateblo.jp/entry/20111007/xargs)

```bash:manの説明
 -I replstr
         Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is speci-
         fied) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be allowed to
         grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to the con-
         structed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not contain
         replstr, and furthermore, no replacement will be done on utility itself.  Implies -x.
```

```bash
# イメージと合っているか確認する
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode | xargs -I{} echo \"{}\"
"Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl"
"Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2"

# 削除してみる
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode | xargs -I{} rm \"{}\"
rm: "Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl": No such file or directory
rm: "Library/Application Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2": No such file or directory

# ダブルスラッシュがだめなのかと思ってスラッシュに置換してみる
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode | sed s#\//\#\/#g
Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl
Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2

# やっぱりうまくいかない
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode | sed s#\//\#\/#g | xargs -I{} rm \"{}\"
rm: "Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl": No such file or directory
rm: "Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2": No such file or directory
```

# `sed`でスペースにバックスラッシュをつけたらうまくいった
さんざん試行錯誤してから思いついた。
シンプルにスペースにエスケープをつければよいのでは？と。

- 参考:[逆引きUNIXコマンド/sedを使ってスペースの文字列操作を行う](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/sed%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E6%93%8D%E4%BD%9C%E3%82%92%E8%A1%8C%E3%81%86)

```bash
# イメージと合っているか確認する
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode | sed -e 's/ /\\ /g'
Library/Application\ Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl
Library/Application\ Support/com.apple.sharedfilelist//com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.dt.xcode.sfl2

# 削除してみる
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode | sed -e 's/ /\\ /g' | xargs rm

# 本当に削除されたかgrepしてみる
$ find Library/Application\ Support/com.apple.sharedfilelist/ -type f | grep -i xcode
$ 
```