要件
- 特定のファイルにサフィックスを付加したい
- サフィックスは
_+2桁の自然数(つまり_01~_99)とする - サフィックスは既存のファイルの中で最大のサフィックスより
1だけ大きい値とする - 既存のファイルがない場合、サフィックスは
_01とする _99が存在するケースは考慮しなくてよい- 関係のないファイルは無視する
具体例
例1
/home/micky/workというディレクトリに以下のファイルが存在する場合
AAA.dat(サフィックスを付加するファイル)AAA_01.dat
この場合、AAA.datの変更後のファイル名はAAA_02.datになる
例2
/home/micky/workというディレクトリに以下のファイルが存在する場合
AAA.dat(サフィックスを付加するファイル)AAA_01.datAAA_98.dat
この場合、AAA.datの変更後のファイル名はAAA_99.datになる
例3
/home/micky/workというディレクトリに以下のファイルが存在する場合
AAA.dat(サフィックスを付加するファイルだけ)
この場合、AAA.datの変更後のファイル名はAAA_01.datになる
例4
/home/micky/workというディレクトリに以下のファイルが存在する場合
AAA.dat(サフィックスを付加するファイル)AAA_001.dat(関係ないファイル)
この場合、AAA.datの変更後のファイル名はAAA_01.datになる
bash で実装
環境
- VirtualBox 6.0
- OS : Cent OS release 7.2.1511
- bash : 4.2.46
#!/bin/bashwork=/home/micky/work/
suf=(`ls"${work}" |
awk'match($0, /^AAA_([[:digit:]]{2})\.dat$/, a) { printf "%02d\n", ( a[1] + 1 ) }' |
sort-n |
tail-1`)mv"${work}"AAA.dat "${work}"AAA_"${suf:-01}".dat
補足
awkで正規表現によるパターンマッチ、部分文字列の取得、カウントアップを行なうsortで昇順に並び替えるtail -1で最後の値(最大値)を取得するAAA_xx.datが無い場合の考慮:${suf:-01}で$sufが空のとき01を設定する- 参考:awkの正規表現でグループ化とキャプチャ、後方参照を行う
ついでに PowerShell でも実装
環境
- OS : Windows 10 Pro 1903
- PowerShell : 5.1
$work='c:\work'Rename-Item(Join-Path$work'AAA.dat')-NewName('AAA_{0:00}.dat'-f((@(dir$work|?{$_.Name-match'^AAA_(\d{2})\.dat$'}|%{$Matches[1]})+'0'|Measure-Object-Maximum).Maximum+1))補足
-matchで正規表現によるパターンマッチを行う$Matchesで部分文字列の取得AAA_xx.datが無い場合の考慮:+ '0'で、あらかじめ要素'0'を用意しておくMeasure-Object -Maximumで最大値を取得する