リモートサーバーにある大量のファイルの中から特定のファイルのみコピーしたい場合などに使えます。
事前準備
コピー元のファイルとコピー先のフォルダを準備
hinomaruc@myMBP % mkdir test && cd test
hinomaruc@myMBP % pwd
/Users/hinomaruc/test
hinomaruc@myMBP % touch aaa-001.txt bbb-001.txt ccc-001.txt
hinomaruc@myMBP % mkdir my-folder
hinomaruc@myMBP % ls
aaa-001.txt bbb-001.txt ccc-001.txt my-folder
csvファイルを準備
# 余計な改行が入らないようにすること
echo -e "/Users/hinomaruc/test/aaa-001.txt /Users/hinomaruc/test/my-folder/aaa-aiueo-001.txt
/Users/hinomaruc/test/bbb-001.txt /Users/hinomaruc/test/my-folder/bbb-kakikukeko-001.txt
/Users/hinomaruc/test/ccc-001.txt /Users/hinomaruc/test/my-folder/ccc-sasisuseso-001.txt" > aaa.csv
・aaa-001.txtをaaa-aiueo-001.txtという名前にリネームしコピー
・bbb-001.txtをbbb-kakikukeko-001.txtという名前にリネームしコピー
・ccc-001.txtをccc-sasisuseso-001.txtという名前にリネームしコピー
という処理を実施したいと思います。
実際は、事前にSQLでデータベースからファイルリストを抽出したり、grepでリモートサーバーのフォルダを検索してリストを作成しておいたりすることが多かと思います。(grepで検索できる条件であればわざわざリストにしなくてもいいかも知れませんが 笑)
シェルスクリプトの作成と実行
CSVファイルからパス名を読み込むシェルスクリプト
# シェルスクリプトの作成
echo -e "
#\!/bin/bash
# aaa.csvからコピー元とコピー先のパスを読み込む
while read FROMFILE TOFILE
do
cp ${FROMFILE} ${TOFILE}
done < /Users/hinomaruc/test/aaa.csv
" > cp_rename.sh
シェルスクリプトを実行する
# シェルスクリプトを実行する
hinomaruc@myMBP % sh cp_rename.sh
# コピーされているか確認
hinomaruc@myMBP % ls my-folder
aaa-aiueo-001.txt bbb-kakikukeko-001.txt ccc-sasisuseso-001.txt
コピーされました。
後ろの連番を除外したファイル名にリネームしてコピーする
おまけです。たまにやりたいときがあるので記録しておきます。
ファイル名と拡張子の間に「-001」や「-002」などの数字があることを想定しています。
連番を除外するバージョン
# 連番を除外するシェルスクリプトの作成
echo -e "
#\!/bin/bash
# aaa.csvからコピー元とコピー先のパスを読み込む
while read FROMFILE TOFILE
do
NEWTOFILE=${TOFILE%-*}
TOEXT=${TOFILE##*.}
cp ${FROMFILE} ${NEWTOFILE}.${TOEXT}
done < /Users/hinomaruc/test/aaa.csv
" > cp_rename_norenban.sh
「-」を区切り文字として、最後の「-」より前の部分をNEWTOFILEという変数に格納します。そして元のファイル名から拡張子を取り出すために、TOFILEから「.」以降の文字列を取り出しTOEXTという変数に格納しておきます。
連番除外バージョンのスクリプトの実行と確認
# シェルスクリプトを実行する
hinomaruc@myMBP % sh cp_rename_norenban.sh
# コピーされているか確認
hinomaruc@myMBP % ls my-folder
aaa-aiueo-001.txt bbb-kakikukeko-001.txt ccc-sasisuseso-001.txt
aaa-aiueo.txt bbb-kakikukeko.txt ccc-sasisuseso.txt
連番がないバージョンが追加されていました。
必ずしもシェルスクリプトでやる必要はないですが、覚えておくと便利かも知れません。