背景
- こんな記事を読みました
- JavaScriptでやれと言われているような気がしたのでやってみます
やりたいこと
- フォルダの中に
abc_test_ok_1_this.csv
・・・abc_test_ok_100_this.csv
のファイルが入っている - これらを
1.csv
・・・100.csv
にリネームしたい - ということだと思う(斜め読みしたから違うかも)
- これらをコマンドラインでワンライナーで実現するというもの
環境
node -v
# v14.5.0
事前準備
- 元記事は
abc_test_ok_1_this.csv
・・・abc_test_ok_100_this.csv
のファイルを用意するところからワンライナーでやってるのでそこから
node -e "const fs=require('fs');[...Array(100).keys()].forEach(i=>fs.writeFile('abc_test_ok_'+(i+1)+'_this.csv','',()=>{}));"
- nodeコマンドは
node main.js
のようにしてファイルを実行できるが、node -e "console.log('Hello')"
のように-e
オプションをつけるとその後をEvalするのでファイルに書かなくても直接実行できる - ちゃんと改行するとこんな感じ
const fs = require('fs');
[...Array(100).keys()].forEach(i => {
fs.writeFile(`abc_test_ok_${i + 1}_this.csv`, '', () => {});
});
-
[...Array(100).keys()]
で要素数100個の配列を作っています-
.kyes()
としてるので配列の各要素には0〜99の値が格納されます -
[0, 1, 2, ... 98, 99]
といった具合
-
- これをforEachしてるので100回ループが回ってます
- ファイルの作成には
fs.writeFile('ファイル名', 'ファイルの内容', callback)
を使っています- ファイル名はお題の名前にしてindexを埋め込んでいる
- ファイルの中身は指定がなかったので空っぽに
- コールバックはとりあえず今回はいらないので空の関数
- という感じで実行すると
abc_test_ok_1_this.csv
・・・abc_test_ok_100_this.csv
が作成されました
ファイルのリネーム
- ここが本題でしょうか
- フォルダの中にある
abc_test_ok_1_this.csv
・・・abc_test_ok_100_this.csv
のファイルを1.csv
・・・100.csv
にリネームします
node -e "const fs=require('fs');fs.readdir(__dirname,(error,files)=>{files.forEach(file=>{fs.rename(file,file.match(/abc_test_ok_(.*)_this.csv/)[1]+'.csv',() => {},);});});"
- さっきと同じくnodeコマンドの
-e
オプションを使ってワンライナーで実現しています - 改行するとこんな感じ
const fs = require('fs');
fs.readdir(__dirname, (error, files) => {
files.forEach(file => {
fs.rename(file, file.match(/abc_test_ok_(.*)_this.csv/)[1] + '.csv', () => {});
});
});
-
fs.readdir('ディレクトリ', callback)
を使ってディレクトリの中のファイル一覧を取得しています- 第1引数はカレントディレクトリでいいので
__dirname
を定義 - 第2引数はファイル名の一覧を処理する関数を定義
- 第1引数はカレントディレクトリでいいので
- filesにファイル名の一覧が入っているので
files.forEach(file => { ... }
でループを回しています -
fs.rename('変更前のファイル名', '変更後のファイル名', callback)
を使ってリネームしています- 変更前のファイルはループで回ってくる
file
- 変更後のファイル名は正規表現で必要な部分を引き抜いています
- callbackは今回は不要なので空の関数
- 変更前のファイルはループで回ってくる
- これでフォルダの中にある
abc_test_ok_1_this.csv
・・・abc_test_ok_100_this.csv
のファイルを1.csv
・・・100.csv
にリネームできました- 余計なファイルがあったときの処理とかはいったん無視しました
終わりに
- ちょっとしたスクリプトを書くのは息抜きの暇つぶしにいいですね。
- Nodeでファイルの読み書きなんてほとんどやったことないのでググりながらやりました。もっとかっこいい書き方あるかも。
- 次は誰かPythonとかRubyとかでお願いします。