LoginSignup
1
0

More than 3 years have passed since last update.

bashでファイル名にサフィックス(連番)を付加する

Posted at

要件

  • 特定のファイルにサフィックスを付加したい
  • サフィックスは_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

補足

ついでに 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で最大値を取得する
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0