自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

【Linux】シェルスクリプトで大量のファイルをコピーしつつリネームもする方法

Linux
Linux

リモートサーバーにある大量のファイルの中から特定のファイルのみコピーしたい場合などに使えます。

スポンサーリンク

事前準備

コピー元のファイルとコピー先のフォルダを準備
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

連番がないバージョンが追加されていました。

必ずしもシェルスクリプトでやる必要はないですが、覚えておくと便利かも知れません。

タイトルとURLをコピーしました