上書きしないようファイル名を連番で変更する

移動元ディレクトリに1つ以上のファイルが存在します。これらのファイルを予め定めておいた「見出し文字」+「2桁の数字」という新ファイル名に変更しながら移動先ディレクトリへ移動します。その際、間違って上書きしないようにというスクリプトを作ってみました。

ここでは、見出し文字は当日の日付としますが、変数 dst_name を変更すればPHOTOでもVOICEでも自由です。

#!/bin/bash
src_dir="./source" # 移動元ディレクトリ
dst_dir="."        # 移動先ディレクトリ
dst_name="`date "+%y%m%d"`"

# #{dst_name}_001を起点に、
# ファイルが既に存在すれば数字を
# インクリメントして上書き防止する
# 仕組み
declare -a src_file=( `ls -1 ${src_dir}` )
for (( i=0; i<${#src_file[*]}; i++ ))
do
 j=1
 while :
 do
  dst_file=`printf "${dst_name}_%02d\n" $j`
  if [ -e ${dst_dir}/${dst_file} ]
  then
   j=`expr $j + 1`
  else 
   break
  fi
 done
 printf " 移動元:%s  " ${src_dir}/${src_file[$i]} 
 printf " 移動先:%s\n" ${dst_dir}/${dst_file}
 mv -i ${src_dir}/${src_file[$i]} ${dst_dir}/${dst_file}
done
# 上書き防止措置 #

 

配列変数 src_file には移動元ディレクトリのファイル名たちが登録されます。まずは210523_01という名前で移動しようとしますが、そのファイルが if 文により存在すると判定されると変数 j がインクリメントされ 210523_02 というファイル名になります。これをファイルが存在しない数値まで繰り返し、break文でwhile文の外へ抜けます。

f:id:S_E_Hyphen:20210523144033p:plain

スクショの事例では、当初5つの0バイトファイルが移動元に存在します。そこで上記スクリプトをじっこうすると、210523_01から210523_05という5つのファイルへと書き換えます。その後、移動元へ新たにAfFugYというファイルを作成してから再度上記スクリプトを実行したところ、事前に作成されていたファイルを上書きすることなく、210523_06という名前に書き換えることに成功しました。