z/OS OMVS 上の作成された文字化けしたファイルやディレクトリーを削除する方法

# はじめに
当記事は、不運にも OMVS 上に作成されてしまった文字化けしたファイルやディレクトリーを削除したときのお話です。

# 背景
OMVS 上で実行されるコマンドをバッチで実行したところ、RC=256 で終了したため、ログを確認したところ、ログの内容が所々文字化けしていました。

嫌な感じがしたので、SSH 接続で OMVS 上に異変が無いか調べたところ、文字化けしたディレクトリーが作成されていました。
```
-bash-4.3$ ls -l
total 192
-rw-r--r--   1 BPXROOT  BPXGRP         0 Jan  5  2023 *
drwxr-xr-x   6 BPXROOT  BPXGRP      8192 Sep 22  2017 SYSTEM
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Dec 28  2022 Service
drwxr-xr-x   4 BPXROOT  BPXGRP     16384 Feb 21  2023 bin
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Aug 19  2021 bk
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 dev -> $SYSNAME/dev
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 etc -> $SYSNAME/etc
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Sep 22  2017 global
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Oct  3  2017 lib
drwxrwxrwx   2 BPXROOT  BPXGRP      8192 Apr  3  2019 log
drwxr-xr-x   3 BPXROOT  BPXGRP      8192 Apr 17  2019 opt
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Jan 26  2023 rsusr
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Sep 23  2017 samples
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 13  2018 serverpac
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 tmp -> $SYSNAME/tmp
drwxr-xr-x  28 BPXROOT  SYS1        8192 Apr 25  2023 u
drwxr-xr-x  10 BPXROOT  BPXGRP      8192 Mar  8  2023 usr
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 var -> $SYSNAME/var
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 15 12:20 ���Ā:���%�
-bash-4.3$
```

# 対処方法
## 1. ls コマンドを駆使して対象を選択して削除
文字化けしたディレクトリーが作成されてすぐに気づいたため、`ls -t | head -1` で削除対象を選択し、`rm` にパイプで渡すことができました。
```
bash-4.3# ls -t | head -1
���Ā:���%�
bash-4.3#
```
これを利用して、`xargs rm` で削除をします。
```
bash-4.3# ls -t | head -1 | xargs rm -fr
bash-4.3# ls -l
total 192
-rw-r--r--   1 BPXROOT  BPXGRP         0 Jan  5  2023 *
drwxr-xr-x   6 BPXROOT  BPXGRP      8192 Sep 22  2017 SYSTEM
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Dec 28  2022 Service
drwxr-xr-x   4 BPXROOT  BPXGRP     16384 Feb 21  2023 bin
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Aug 19  2021 bk
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 dev -> $SYSNAME/dev
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 etc -> $SYSNAME/etc
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Sep 22  2017 global
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Oct  3  2017 lib
drwxrwxrwx   2 BPXROOT  BPXGRP      8192 Apr  3  2019 log
drwxr-xr-x   3 BPXROOT  BPXGRP      8192 Apr 17  2019 opt
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Jan 26  2023 rsusr
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Sep 23  2017 samples
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 13  2018 serverpac
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 tmp -> $SYSNAME/tmp
drwxr-xr-x  28 BPXROOT  SYS1        8192 Apr 25  2023 u
drwxr-xr-x  10 BPXROOT  BPXGRP      8192 Mar  8  2023 usr
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 var -> $SYSNAME/var
bash-4.3#
```
ちゃんと削除されていますね！


## 2. inode 番号指定で削除
今回は `ls` コマンドの出力で削除対象を選択できましたが、一般的には inode 番号で対象を選択して削除することが多いと思いますので、そちらも試してみます。

（愚かにも）文字化けしたディレクトリーを再作成して、inode 番号で削除を試してみます。
```
bash-4.3# ls -l
total 192
-rw-r--r--   1 BPXROOT  BPXGRP         0 Jan  5  2023 *
drwxr-xr-x   6 BPXROOT  BPXGRP      8192 Sep 22  2017 SYSTEM
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Dec 28  2022 Service
drwxr-xr-x   4 BPXROOT  BPXGRP     16384 Feb 21  2023 bin
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Aug 19  2021 bk
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 dev -> $SYSNAME/dev
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 etc -> $SYSNAME/etc
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Sep 22  2017 global
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Oct  3  2017 lib
drwxrwxrwx   2 BPXROOT  BPXGRP      8192 Apr  3  2019 log
drwxr-xr-x   3 BPXROOT  BPXGRP      8192 Apr 17  2019 opt
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Jan 26  2023 rsusr
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Sep 23  2017 samples
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 13  2018 serverpac
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 tmp -> $SYSNAME/tmp
drwxr-xr-x  28 BPXROOT  SYS1        8192 Apr 25  2023 u
drwxr-xr-x  10 BPXROOT  BPXGRP      8192 Mar  8  2023 usr
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 var -> $SYSNAME/var
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 15 14:14 ���Ā:���%�
bash-4.3#
```

i-node 番号は `ls -i` で表示できます。
```
bash-4.3# ls -il
total 192
20098 -rw-r--r--   1 BPXROOT  BPXGRP         0 Jan  5  2023 *
38924 drwxr-xr-x   6 BPXROOT  BPXGRP      8192 Sep 22  2017 SYSTEM
38957 drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Dec 28  2022 Service
38562 drwxr-xr-x   4 BPXROOT  BPXGRP     16384 Feb 21  2023 bin
20999 drwxr-xr-x   2 BPXROOT  BPXGRP         0 Aug 19  2021 bk
38937 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 dev -> $SYSNAME/dev
    2 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 etc -> $SYSNAME/etc
38923 drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Sep 22  2017 global
38560 drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Oct  3  2017 lib
 5149 drwxrwxrwx   2 BPXROOT  BPXGRP      8192 Apr  3  2019 log
38934 drwxr-xr-x   3 BPXROOT  BPXGRP      8192 Apr 17  2019 opt
 5147 drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Jan 26  2023 rsusr
38829 drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Sep 23  2017 samples
38958 drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 13  2018 serverpac
38938 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 tmp -> $SYSNAME/tmp
    1 drwxr-xr-x  28 BPXROOT  SYS1        8192 Apr 25  2023 u
    3 drwxr-xr-x  10 BPXROOT  BPXGRP      8192 Mar  8  2023 usr
    7 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 var -> $SYSNAME/var
18213 drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 15 14:14 ���Ā:���%�
bash-4.3#
```

文字化けしたディレクトリーの inode 番号は `18213` と分かりました。
これを使って、単純に inode 番号 18213 のデータを削除、、とするとマズいです。

試しに `find -inum` コマンドで inode=18213 のデータを検索してみると、、、
```
bash-4.3# find . -inum 18213
./usr/lpp/liberty_zos/19.0.0.3/lib/features/l10n/com.ibm.websphere.appserver.restConnector-2.0_de.properties
./rsusr/rocket/ported/python-2017-04-12-py27/pkgs/jupyter-dashboards-0.6.1-py27_1/lib/python2.7/site-packages/jupyter_dashboards/nbextension/notebook/bower_components/jquery-ui/themes/hot-sneaks/theme.css
./rsusr/rocket/ported/python-2017-04-12-py27/python27/lib/python2.7/site-packages/jupyter_dashboards/nbextension/notebook/bower_components/jquery-ui/themes/hot-sneaks/theme.css
./���Ā:���%�
bash-4.3#
```
複数合致してしまいました。

OMVS では zFS (HFS) データ・セットがファイル・システムとしてマウントされており、大きなデータセットの作成はをしない運用をすることが多いです。(3390-x 型の単位の DASD を利用していたり、4 GB を超える VSAM を作成する場合には追加の設定が必要だったり。。)
inode 番号はファイル・システム単位で管理されているため、コンポーネントや用途単位で細かくファイル・システムを分ける運用が多い OMVS では、上記のような重複が発生しやすいです。

ですので、`find -level 0` を利用して、現在のディレクトリーで上記の inode 番号を持つデータのみを検索します。
```
bash-4.3# ls -li
total 192
20098 -rw-r--r--   1 BPXROOT  BPXGRP         0 Jan  5  2023 *
38924 drwxr-xr-x   6 BPXROOT  BPXGRP      8192 Sep 22  2017 SYSTEM
38957 drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Dec 28  2022 Service
38562 drwxr-xr-x   4 BPXROOT  BPXGRP     16384 Feb 21  2023 bin
20999 drwxr-xr-x   2 BPXROOT  BPXGRP         0 Aug 19  2021 bk
38937 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 dev -> $SYSNAME/dev
    2 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 etc -> $SYSNAME/etc
38923 drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Sep 22  2017 global
38560 drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Oct  3  2017 lib
 5149 drwxrwxrwx   2 BPXROOT  BPXGRP      8192 Apr  3  2019 log
38934 drwxr-xr-x   3 BPXROOT  BPXGRP      8192 Apr 17  2019 opt
 5147 drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Jan 26  2023 rsusr
38829 drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Sep 23  2017 samples
38958 drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 13  2018 serverpac
38938 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 tmp -> $SYSNAME/tmp
    1 drwxr-xr-x  28 BPXROOT  SYS1        8192 Apr 25  2023 u
    3 drwxr-xr-x  10 BPXROOT  BPXGRP      8192 Mar  8  2023 usr
    7 lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 var -> $SYSNAME/var
18213 drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 15 14:14 ���Ā:���%�
bash-4.3# find . -inum 18213 -level 0
./���Ā:���%�
bash-4.3#
```

inode 指定で削除対象のディレクトリーのみが選択されたことを確認できましたので、`xargs rm` で削除を行います（削除前の確認は大切）。

```
bash-4.3# find . -inum 18213 -level 0 | xargs rm -fr
bash-4.3# ls -l
total 192
-rw-r--r--   1 BPXROOT  BPXGRP         0 Jan  5  2023 *
drwxr-xr-x   6 BPXROOT  BPXGRP      8192 Sep 22  2017 SYSTEM
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Dec 28  2022 Service
drwxr-xr-x   4 BPXROOT  BPXGRP     16384 Feb 21  2023 bin
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Aug 19  2021 bk
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 dev -> $SYSNAME/dev
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 etc -> $SYSNAME/etc
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Sep 22  2017 global
drwxr-xr-x   2 BPXROOT  BPXGRP      8192 Oct  3  2017 lib
drwxrwxrwx   2 BPXROOT  BPXGRP      8192 Apr  3  2019 log
drwxr-xr-x   3 BPXROOT  BPXGRP      8192 Apr 17  2019 opt
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Jan 26  2023 rsusr
drwxr-xr-x   4 BPXROOT  BPXGRP      8192 Sep 23  2017 samples
drwxr-xr-x   2 BPXROOT  BPXGRP         0 Feb 13  2018 serverpac
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 tmp -> $SYSNAME/tmp
drwxr-xr-x  28 BPXROOT  SYS1        8192 Apr 25  2023 u
drwxr-xr-x  10 BPXROOT  BPXGRP      8192 Mar  8  2023 usr
lrwxrwxrwx   1 BPXROOT  BPXGRP        12 Oct 24  2017 var -> $SYSNAME/var
bash-4.3#
```
削除完了！


# おわりに
OMVS 上で実行可能なコマンドは、あまりリッチではなく、通常の Linux では「使えて当たり前」なものもサポートしていないことがしばしばありますが、文字化けしたディレクトリー/ファイルの削除については、一般的な手順でできることが確認できました。