CentOS 7 の不要な言語(locale)を削除する

## locale
`locale-archive` や `/usr/share/locale` はそれぞれ102MBと89MBを消費しており、一般的に日本語と英語以外は使用する可能性は低いので他の言語は除去しても良いかもしれない。

## glibc-common
言語ファイルは `glibc-common` パッケージでインストールされている。
`glibc-common` パッケージには GNU libc ライブラリ用の共通バイナリと各国語（ロケール）サポートが含まれる。 [^glibc-common]

[^glibc-common]: "The glibc-common package includes common binaries for the GNU libc libraries, as well as national language (locale) support." - Description - [glibc-common-2.17-260.el7_6.3.x86_64.rpm](https://centos.pkgs.org/7/centos-updates-x86_64/glibc-common-2.17-260.el7_6.3.x86_64.rpm.html)

### locale-archive のサイズ
```bash
du -h /usr/lib/locale/locale-archive
```
```
102M	/usr/lib/locale/locale-archive
```
locale-archive のサイズを確認すると102MBある。

## 言語の確認
### 使用可能な言語の確認
```bash
localedef --list-archive | less
```
```bash
locale --all-locales | less
```
使用可能な言語は `localedef --list-archive` または `locale --all-locales` コマンドで確認ができる。
`locale -a` は `localedef --list` の結果に加えて `C` と `POSIX` が出力される。

### 残す言語の確認
```bash
localedef --list-archive | egrep --ignore-case "^(ja|en_US)"
```
```
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```
英語と日本語以外を削除する場合の正規表現の確認。この結果を除外した一覧を作成して削除する。

## 不要な言語の削除
```bash
localedef --list-archive | egrep --invert-match --ignore-case "^(ja|en_US)" | xargs localedef --delete-from-archive && \
mv --force /usr/lib/locale/locale-archive{,.tmpl} && \
build-locale-archive --verbose
```
```
input archive file: /usr/lib/locale/locale-archive.tmpl
input alias file: /usr/share/locale/locale.alias
input locale directory prefix: /usr/lib/locale/
output archive file: /usr/lib/locale/locale-archive
```
先ほど作成した残す言語の一覧を除外した一覧を作成して `xargs` で `localedef --delete-from-archive` コマンドに渡した後に `build-locale-archive` コマンドを実行すると削除される。
その際に `locale-archive.tmpl` ファイルがないと `build-locale-archive: cannot read archive header` とエラーが出るので、事前に `locale-archive` を `locale-archive.tmpl` にリネームする。

## 削除後の言語の確認
```bash
locale -a
```
```
C
POSIX
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
japanese.eucjp
```

### locale-archive のサイズの再確認

```bash
du -h /usr/lib/locale/locale-archive
```
```
3.8M	/usr/lib/locale/locale-archive
```
102MB から 3.8MB まで削減された。

## /usr/share/locale

### /usr/share/locale の容量
```bash
du -h --max-depth=1 /usr/share/locale | sort -hr | head
```
```
89M 	/usr/share/locale/
4.9M	/usr/share/locale/uk
4.2M	/usr/share/locale/fr
3.6M	/usr/share/locale/de
3.5M	/usr/share/locale/pl
3.5M	/usr/share/locale/es
3.3M	/usr/share/locale/sv
3.2M	/usr/share/locale/vi
3.2M	/usr/share/locale/ru
3.1M	/usr/share/locale/ja
```
`/usr/share/locale` 配下のファイルは `build-locale-archive` コマンドでは削除されない。

### 削除するメッセージカタログの確認
```bash
ls -1 /usr/share/locale | egrep -v "^(default|en|ja|locale)" | less
```

### メッセージカタログの削除
```bash
cd /usr/share/locale && \
ls -1 /usr/share/locale | egrep -v "^(default|en|ja|locale)" | xargs rm -fr
```

###
```bash
du -h --max-depth=1 /usr/share/locale | sort -hr | head -n1
```
```
5.6M	/usr/share/locale
```
89MB から 5.6MB まで削減された。

### /usr/share/i18n/locales の容量
```bash
du -h --max-depth=1 /usr/share/i18n/locales
```
```
6.3M	/usr/share/i18n/locales
```

### /usr/share/man
```bash
du -h --max-depth=1 /usr/share/man | sort -hr | head
```
```
19M	/usr/share/man
8.3M	/usr/share/man/man1
3.5M	/usr/share/man/man8
2.0M	/usr/share/man/man3
1.5M	/usr/share/man/man5
360K	/usr/share/man/ru
324K	/usr/share/man/man7
296K	/usr/share/man/fr
272K	/usr/share/man/ja
252K	/usr/share/man/it
```
```bash
ls -1 /usr/share/man/ | egrep -v "^(en|ja|man)" | less
```
```bash
cd /usr/share/man/ && \
ls -1 /usr/share/man/ | egrep -v "^(en|ja|man)" | xargs rm -fr
```
```bash
 du -h --max-depth=1 /usr/share/man | sort -hr | head -n1
```
```
16M	/usr/share/man
```
### /var/cache/man
```bash
du -h --max-depth=1 /var/cache/man | sort -hr | head
```
```
940K	/var/cache/man
28K	/var/cache/man/ru
24K	/var/cache/man/fr
20K	/var/cache/man/zh_TW
20K	/var/cache/man/zh_CN
20K	/var/cache/man/zh
20K	/var/cache/man/tr
20K	/var/cache/man/sv
20K	/var/cache/man/sk
20K	/var/cache/man/ro
```

```bash
du -h --max-depth=1 /usr/share/vim/vim74/lang/ | sort -hr | head
```
```
6.3M	/usr/share/vim/vim74/lang/
216K	/usr/share/vim/vim74/lang/ru
196K	/usr/share/vim/vim74/lang/uk
188K	/usr/share/vim/vim74/lang/ja
168K	/usr/share/vim/vim74/lang/ru.cp1251
168K	/usr/share/vim/vim74/lang/pl.UTF-8
168K	/usr/share/vim/vim74/lang/it
168K	/usr/share/vim/vim74/lang/fr
164K	/usr/share/vim/vim74/lang/pl.cp1250
164K	/usr/share/vim/vim74/lang/pl
```

## 別の方法
```bash
echo '%_install_langs en_US:ja' > /etc/rpm/macros.lang && \
yum --assumeyes reinstall glibc-common
```
[Remi's RPM repository](https://rpms.remirepo.net/) の [Remi Collet](https://twitter.com/remicollet) が [How remove unused locale? - Ask Fedora: Community Knowledge Base and Support Forum](https://ask.fedoraproject.org/en/question/7870/how-remove-unused-locale/) で「最近のディスク容量じゃ0.5GBくらいたいした問題じゃないけど」と言いつつ `build-locale-archive` コマンドを使わない別の方法を提示している。

この方法でも `locale-archive` ファイルのサイズ以外は特に影響がない模様。


## 空ディレクトリーの削除
```
find . -type d -empty | xargs rm -r && \
find . -type d -empty | xargs rm -r
```


* [日本語ロケールに ja_JP.SJIS を使用するように設定する - Knowledgebase - Red Hat Customer Portal](https://access.redhat.com/ja/solutions/1218253)
* [ja_JP.UTF-8 と ja_JP.utf8 に違いはありますか? - Knowledgebase - Red Hat Customer Portal](https://access.redhat.com/ja/solutions/509073)