要件
- 特定のファイルにサフィックスを付加したい
- サフィックスは
_+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/bash
work=/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で最大値を取得する