MENU

ファイル名に数字の部分があったら、桁数を引数で指定してゼロ埋めするbashスクリプト

この記事では、ファイル名に含まれる数字部分を指定した桁数でゼロ埋めするBashスクリプトを紹介し、その技術的な詳細を解説します。このスクリプトは、数字部分を柔軟に処理し、デフォルトで4桁、引数を指定することで任意の桁数でゼロ埋めすることができます。MacやLinux環境で動作し、ファイル名の管理や整理を効率的に行えます。

目次

スクリプトの概要

このスクリプトは、ディレクトリ内のすべてのファイルを対象にして、ファイル名に含まれる数字部分を指定された桁数でゼロ埋めします。ゼロ埋めの桁数は、スクリプトの引数として指定することができ、引数が指定されない場合はデフォルトで4桁になります。

スクリプト全文

#!/bin/bash

# ゼロ埋めする桁数を引数から取得、デフォルトは4桁
pad_length=${1:-4}

# ディレクトリ内のすべてのファイルを処理する
for file in *; do
  # ファイル名を変数に格納
  original_name="$file"
  modified_name=""
  number=""

  # ファイル名の各部分をチェック
  while IFS= read -r -n1 char; do
    if [[ "$char" =~ [0-9] ]]; then
      number="$number$char"
    else
      if [[ -n "$number" ]]; then
        # 8進数の解釈を避けるため、整数として扱う
        number=$((10#$number))
        if [[ ${#number} -le $pad_length ]]; then
          modified_name="${modified_name}$(printf "%0${pad_length}d" "$number")"
        else
          modified_name="${modified_name}$number"
        fi
        number=""
      fi
      modified_name="$modified_name$char"
    fi
  done <<< "$original_name"

  # 末尾に数字があった場合、それをゼロ埋めする
  if [[ -n "$number" ]]; then
    number=$((10#$number))
    if [[ ${#number} -le $pad_length ]]; then
      modified_name="${modified_name}$(printf "%0${pad_length}d" "$number")"
    else
      modified_name="${modified_name}$number"
    fi
  fi

  # 名前が変更されていればファイル名を変更
  if [ "$original_name" != "$modified_name" ]; then
    mv "$original_name" "$modified_name"
    echo "Renamed: $original_name -> $modified_name"
  fi
done

技術的な解説

引数による桁数の指定

pad_length=${1:-4}

この部分は、スクリプトに渡された引数を pad_length という変数に代入しています。引数が指定されなかった場合には、デフォルトで4桁が使用されます。これにより、ユーザーは必要に応じて任意の桁数でゼロ埋めが可能です。

ファイル名の処理

スクリプトは、for file in *; do ループを使って、現在のディレクトリ内にあるすべてのファイルを順番に処理します。ファイル名の各文字を1文字ずつチェックし、数字部分を検出してゼロ埋めを行います。

8進数の解釈を回避

number=$((10#$number))

printf コマンドは、数字の先頭にゼロがついていると、それを8進数として解釈しようとします。このため、先頭のゼロを取り除いてから処理を行う必要があります。この行で number 変数を整数に変換し、8進数の誤解釈を回避しています。

printf を使ったゼロ埋め

modified_name="${modified_name}$(printf "%0${pad_length}d" "$number")"

この部分で、printf コマンドを使用して、指定された桁数で数字をゼロ埋めしています。${pad_length} によってゼロ埋めする桁数が動的に決定されます。

ファイル名の変更

mv "$original_name" "$modified_name"

最後に、元のファイル名とゼロ埋めされた新しいファイル名を比較し、異なる場合はmvコマンドを使用してファイル名を変更します。これにより、ファイルが適切にリネームされ、処理が完了します。

使用例

このスクリプトを利用する際の基本的な実行例を以下に示します。

  1. デフォルトで4桁ゼロ埋めを行う場合:
./rename_files.sh
  1. 6桁でゼロ埋めを行いたい場合:
./rename_files.sh 6

このようにして、任意の桁数で数字部分をゼロ埋めすることができます。ファイル名に含まれる複数の数字部分にも対応しており、ファイル管理の際に役立つツールとなるでしょう。

まとめ

このスクリプトは、Bashでのファイル名処理を強力かつ柔軟に行うための便利なツールです。MacやLinuxの環境でスムーズに動作し、シンプルなコマンドでファイル名の数字部分を整形することができます。ぜひ、ご自身のプロジェクトで活用してみてください。

目次