書類を送るときに,受取人ごとに異なるセットで書類をまとめる必要がある場合のための,ファイルの複製用スクリプトです.

スクリプトを実行すると,マスタディレクトリからデータが複製され,各宛先用のディレクトリが作成されます.

目次

  1. 使い方
    1. スクリプトの設定
    2. CSV
  2. 備考
  3. スクリプト

使い方

スクリプトの設定

次の3つのパスを設定しておきます.

  • マスタディレクトリ
  • 複製先ディレクトリ
  • CSV

CSV

これから述べる形式でExcelにて表を作り,UnicodeのCSVで保存します.

  • 行見出し:ファイル名
  • 列見出し:送り先

セル内改行やコンマ・スペース等が入ったファイル名には対応していません.

内部の各セルはTRUEFALSEの2値を入れて,宛先ごとのファイルの有無を指定します.

宛先A 宛先B
ファイル1 TRUE TRUE
ファイル2 FALSE TRUE
ファイル3 FALSE FALSE

この例だと,スクリプト実行時には

  • 「宛先A」ディレクトリに「ファイル1」が複製される
  • 「宛先B」ディレクトリに「ファイル1」と「ファイル2」が複製される

となります.
なお,「宛先A」・「宛先B」ディレクトリは複製先ディレクトリ内に作られます.

備考

  • 複製するものはファイルでなく,ディレクトリとすることもできます.この場合,ディレクトリを中身ごとコピーします.
  • 複製するファイルがマスタディレクトリの下の階層にある場合,CSVにはマスタディレクトリからの相対パスで記述します.
  • CSVがCRLFである場合,LFに置換して上書き保存ます.
  • TRUEFALSEは内部的にはtruefalseに置換して処理します.このため,Excelを使わずにファイルを作成した場合,truefalseとなっていても構いません.

スクリプト

macOSでgsedコマンドを使ったスクリプトになっています.
Linuxでは適当にsedにしてご使用ください.

mst_dir="書類を入れているマスタディレクトリのパス"
cp_dir="複製先のディレクトリのパス"
csv="CSVファイルのパス"

tmp_IFS=$IFS
IFS=,

gsed -i'' 's/\r//g' $csv #macではgsed

title_row=true
while read -a row
do
file_name=${row[0]}
k=1 #kはk人目の宛先

if test $title_row = true
then
while [ -n "${row[k]}" ]
do
addr_name[k]="${row[k]}/"
mkdir -p $cp_dir${addr_name[k]}
maxcol=$k
k=`expr $k + 1`
done
title_row=false
continue
fi

while [ $k -le $maxcol ]
do
if [ `echo ${row[k]} | tr '[:upper:]' '[:lower:]'` = true ]
then
cp -R $mst_dir$file_name $cp_dir${addr_name[k]}
fi
k=`expr $k + 1`
done
done < $csv

IFS=$tmp_IFS