40682
macのbashでのコマンド処理についての質問です。  
フォルダ内にある末尾がzip以外のモノを削除するようにしたいのですが、ファイル・フォルダ名に空白がある場合、うまく処理してくれません。解決するにはどうすればいいでしょうか。  
宜しくお願い致します。

`ls | grep -v -E 'zip$' | xargs rm -r`
CC BY-SA 3.0
2018-01-03T02:36:32.237
40679
2018-01-05T14:12:20.520
2018-01-03T04:53:19.423
3060
25524
question
bash macos
bashでファイル名の半角処理についての質問です
`xargs`(1)
のデフォルトは標準入力をそのまま指定したコマンドに渡すのではなく、空白文字で分けたり、ダブルクォートやバックスラッシュでエスケープしたり、色々解釈します。詳しくはマニュアルなどをどうぞ。よって、そのような特別な文字を含む入力を与える場合は工夫が必要です。よくわからない、理解したくないというなら
`xargs`(1) は危険なので使わないことを推奨します。

ファイルの名前や種類を条件に絞り込み一定の処理をしたい場合は `find`(1) をお薦めします:

```

    $ find /path/to/dir -type f ! -name '*.zip' -delete
    
```

フォルダが空になったら削除したいなら:

```

    $ find /path/to/dir -type f -name '*.zip' -delete -o -type d -empty -delete
    
```

挙げられているコマンドライン例のように特定フォルダ直下の `*.zip` 以外のファイルを削除するなら:

```

    $ find /path/to/dir -maxdepth 1 -type f ! -name '*.zip' -delete
    
```
CC BY-SA 3.0
2018-01-03T05:50:25.547
40682
2018-01-05T14:12:20.520
2018-01-05T14:12:20.520
3061
3061
40679
answer
補足として。bashのオプションで`extglob`が有効になっていると、`!(pattern)`という（パターンにマッチしないファイルにマッチする）パターンマッチング演算子が使えます。ただし、macOSのデフォルトでは`extglob`がオフだったと思います。

```

    $ shopt -s extglob
    $ rm !(*.zip)
    
```
CC BY-SA 3.0
2018-01-03T08:08:43.710
40686
2018-01-03T08:08:43.710
4010
40679
answer