初心者｜node.jsのREPLでファイルをリネーム

以前に[初心者｜node.jsでリネーム。フォルダからファイル名一覧を取得し一括変更する](https://qiita.com/tomokei5634/items/ceac6438216e8ddd3127)という記事を書きました。

でも「いちいちファイルを作成して実行するのは面倒やなぁ」と思い、node.jsのREPL（リプル）で実行することにしました。

今回したかったことは、あるディレクトリ内にある複数の画像ファイルの名称を一括で変更することです。変更した名称には連番もつけます。

# 要件
* node.js がインストールされている
* node.jsのREPLを使いたい
* 特定のフォルダ内のファイルを一括リネームしたい
* ファイル名に連番もつけたい
* 対象のファイルを種類（拡張子）で抽出したい（フィルタリングしたい）

# 例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/73560d17-6c57-da95-2da5-bf08b99b046e.png)

| リネーム前 | リネーム後 |
|:--:|:--:|
| IMG_xxxx.jpg | newFileName-●.jpg |

* リネーム前の名称は何でもいい
* `●`は連番

# そもそもMACには、一括リネーム機能がついています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/a3408100-f18f-e3e3-cc70-b2e5db878e87.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/624bd4e4-24ad-afc2-33df-b3f7cfeedca0.png)

* 対象ファイルを選択して、右クリック
* `●項目の名前を変更...` をクリック
* あとは、よしなに...

# 本題
## 1）ターミナルを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/37714660-b70a-b03c-0794-991b0b61c62d.png)

* リネームするファイルがあるディレクトリでターミナルを開いてください
* （例） imeges ディレクトリ内に 24個の jpgファイルがあります

　
## 2）REPLの起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/03007058-9298-6fa8-4f57-fdd2f6d12386.png)

```terminal:terminal
$ node
```

* `node` +　エンターキーでnode.jsのREPLが起動します

## 3）モジュール読み込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/f53f54b0-b866-a8f7-c6ae-3eac4d1edb1c.png)

```terminal:REPL(node.js)
$ const fs = require("fs"),
  path = require("path");
```

* nodeのモジュール`fs` と `path` を読み込みます。

## 4）ファイル名の取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/5278b3af-9481-be65-270f-2e62787b07a5.png)

```terminal:REPL(node.js)
$ const dir = "./",
  fileNameList = fs.readdirSync(dir),
  filteredFileNames = fileNameList.filter(RegExp.prototype.test, /.*\.jpg$/);
```

* `dir = "./"` では、カレントディレクトリをセットしています
* `fileNameList = fs.readdirSync(dir)`で、カレントディレクトリ内のファイル名一式を取得しています（この時点では隠しファイルなど**jpg以外のファイル**も読み込んでいます）。
* `filteredFileNames = fileNameList.filter(RegExp.prototype.test, /.*\.jpg$/)` で、jpgファイルに絞っています（jpg以外のファイルを捨てています）。jpg以外のファイルをリネームする場合は`\.jpg`を任意の拡張子に書き換えてください。

## 5）変更後のファイル名を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/23e249e2-a51b-d837-4804-4fc6e7cf5ee4.png)

```terminal:REPL(node.js)
$ const newName = "newFileName-";
$ let i = 1;
```

* `newName = "newFileName-"` で、新しいファイル名をセットしています。任意に書き換えてください。
* `i = 1` は、ファイル名に付与する連番のスタート値です

## 6）ファイル名の一括変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/47748c82-53ac-df33-cc86-c06fd5409a88.png)

```terminal:REPL(node.js)
$ filteredFileNames.forEach((fileName) => {
    const filePath = {};
    filePath.before = path.join(dir, fileName);
    filePath.after = path.join(dir, newName + i + ".jpg");
    fs.rename(filePath.before, filePath.after, (err) => {
      if (err) throw err;
      console.log(filePath.before + " -> " + filePath.after);
    });
    i++;
  });
```

* `filePath.after = path.join(dir, newName + i + ".jpg")` でリネーム後のファイル名（名称+連番）をセットしています。
* 拡張子を忘れないように、ご注意ください。
* `i++;`を忘れると、全ファイルが同じ名称 ＝ ファイルが１つだけになるので、ご注意ください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/8c060e11-bd85-6920-19dc-e18025edbe99.png)

リネームができれば成功です。

## 7）REPLの終了

REPL(node.js)上で キー`control + c` を２回するとREPLが終了できます。