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