現場あるあるシーン。
昨日のテストデータファイルの日付を今日に変更しといてね
$ ls
TOKYO_0000_20210629.csv
TOKYO_0001_20210629.csv
・
TOKYO_0999_20210629.csv
うわぁ。。。ファイルが1000個もある。。
大丈夫、5秒でできますよ 。
renameコマンドでファイル名一括置換
こんなとき直ぐに思いつくのがrenameコマンドだと思います。便利ですよね。
注意点としてはLinux環境によって使い方が異なる点。
Ubuntuの環境とそれ以外のLinux環境では若干使い方が変わってきます。
[Ubuntuの場合]
rename ‘s/置換前文字列/置換後文字列/’ 対象ファイル1 対象ファイル2 …
今回のように一括置換をしたい場合は下記のようになります。sedコマンドの置換の記述を使うのですね。
$ rename 's/20210629/20210630/' TOKYO*.csv
[Ubuntu以外のLinuxOSの場合]
もっと直感的に記述ができます。
rename 置換前文字列 置換後文字列 対象ファイル1 対象ファイル2 …
今回の例の場合下記のようになります。簡単ですね。
$ rename 20210629 20210630 TOKYO*.csv
renameコマンドが使えない環境での一括置換
しかし、場合によってはrenameコマンドが使えない環境だってあります。
どんな環境であっても基本のbashコマンドを押さえておけばファイル名の一括置換は怖くありません。
SESエンジニアたる者、郷に入っては郷に従うです。
どんな環境でも使える基本のbashコマンドをパイプ「|」でつないで、処理結果を次の処理へと渡していきます。
今回の場合はこんな感じです。
【対象ファイルを洗い出して次の処理へ渡す】⇨【対象ファイル名と置換後のファイル名を2つの変数として次の処理へ渡す】⇨【mvコマンドでファイル名を変更する】
実際にやってみましょう。ファイル名の一部「20210629」を「20210630」に変更します。
# ファイルの確認。1000個あります。
$ ls -l
-rw-r--r-- 1 dipolecats admin 0B 6 27 10:34 TOKYO_0000_20210629.csv
-rw-r--r-- 1 dipolecats admin 0B 6 27 10:36 TOKYO_0001_20210629.csv
(中略)
-rw-r--r-- 1 dipolecats admin 0B 6 27 10:36 TOKYO_0999_20210629.csv
# ファイル名一括置換の実行
$ ls TOKYO* | sed 'p;s/20210629/20210630/' | xargs -n 2 mv
# 置換後のファイル確認
$ ls -l
total 0
-rw-r--r-- 1 dipolecats admin 0 6 27 10:34 TOKYO_0000_20210630.csv
-rw-r--r-- 1 dipolecats admin 0 6 27 10:36 TOKYO_0001_20210630.csv
(中略)
-rw-r--r-- 1 dipolecats admin 0 6 27 10:36 TOKYO_0999_20210630.csv
一括置換の実行で何をやっているのか、一つずつみてみましょう。
① 「 ls TOKYO* | 」
TOKYOで始まるファイルを次の処理へ渡す
② 「sed ‘p;s/20210629/20210630/’ | 」
p;sとセミコロンで繋ぐことで、sedコマンドの2つの処理を行なっています。
pは受け取ったファイル名をそのまま表示する。
sは置換です。受け取ったファイル名の「20210629」を「20210630」に変換したファイル名を表示します。
パイプ「|」で繋いでいるので、実際には表示されるのではなく、元のファイル名と置換後のファイル名の2つを次の処理に渡しています。
③ 「 xargs -n 2 mv 」
xargsは前の処理の結果を引数として受け取り、コマンドに渡すことができます。
「-n 2」で2つの引数を受け取ります。今回の場合、元のファイル名と置換後のファイル名ですね。
その2つをmvコマンドに渡してあげてファイル名の置換が行われるということです。
どうでしょうか。どんな環境でも使える基本bashコマンドを使った一括置換、覚えておいて損はないと思います。
コメント