Linuxで複数ファイルをリネームして一括コピーする
Pocket

仕事で、大量にあるファイルの一部分のみをリネームしてコピーを行いたい事があったので、その備忘。
イメージとしては、以下のようなファイルがあって、それの一部、例えば以下の例だとhostname_aaa_*をhostname_bbb_*へリネームコピーしたい、といった具合。

20160103_000000

[root@localhost work]# ls -la /work
合計 32
drwxr-xr-x.  2 root root 4096  1月  3 09:20 .
dr-xr-xr-x. 18 root root 4096  1月  3 09:08 ..
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_000.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_001.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_002.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_003.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_004.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_005.txt
[root@localhost work]# grep "" /work/*
/work/hostname_aaa_000.txt:aaa_000
/work/hostname_aaa_001.txt:aaa_001
/work/hostname_aaa_002.txt:aaa_002
/work/hostname_aaa_003.txt:aaa_003
/work/hostname_aaa_004.txt:aaa_004
/work/hostname_aaa_005.txt:aaa_005

 

Sponsored Links

こういった場合に、いちいちファイルを一個づつコピーするなんて面倒な事はしたくない。
という訳で、以下のコマンドで一括コピーを行う事にした。

for i in `ls *コピー元*`; do cp $i `echo $i | sed "s/置換前文字列/置換後文字列/g"`; done

20160103_000002

[root@localhost work]# ls -la /work
合計 32
drwxr-xr-x.  2 root root 4096  1月  3 09:25 .
dr-xr-xr-x. 18 root root 4096  1月  3 09:08 ..
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_000.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_001.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_002.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_003.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_004.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_005.txt
[root@localhost work]#
[root@localhost work]# grep "" /work/*
/work/hostname_aaa_000.txt:aaa_000
/work/hostname_aaa_001.txt:aaa_001
/work/hostname_aaa_002.txt:aaa_002
/work/hostname_aaa_003.txt:aaa_003
/work/hostname_aaa_004.txt:aaa_004
/work/hostname_aaa_005.txt:aaa_005
[root@localhost work]# for i in `ls /work/hostname_aaa_*.txt`; do cp $i `echo $i | sed "s/aaa/bbb/g"`; done
[root@localhost work]#
[root@localhost work]# ls -la /work
合計 56
drwxr-xr-x.  2 root root 4096  1月  3 09:26 .
dr-xr-xr-x. 18 root root 4096  1月  3 09:08 ..
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_000.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_001.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_002.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_003.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_004.txt
-rw-r--r--.  1 root root    8  1月  3 09:20 hostname_aaa_005.txt
-rw-r--r--.  1 root root    8  1月  3 09:26 hostname_bbb_000.txt
-rw-r--r--.  1 root root    8  1月  3 09:26 hostname_bbb_001.txt
-rw-r--r--.  1 root root    8  1月  3 09:26 hostname_bbb_002.txt
-rw-r--r--.  1 root root    8  1月  3 09:26 hostname_bbb_003.txt
-rw-r--r--.  1 root root    8  1月  3 09:26 hostname_bbb_004.txt
-rw-r--r--.  1 root root    8  1月  3 09:26 hostname_bbb_005.txt
[root@localhost work]#
[root@localhost work]# grep "" /work/hostname_bbb_00*
/work/hostname_bbb_000.txt:aaa_000
/work/hostname_bbb_001.txt:aaa_001
/work/hostname_bbb_002.txt:aaa_002
/work/hostname_bbb_003.txt:aaa_003
/work/hostname_bbb_004.txt:aaa_004
/work/hostname_bbb_005.txt:aaa_005

 

Ansibleのyamlファイルとかでホスト名ごとに作成されている場合とか(今回の場合それ)に使えるだろう。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

This article has 1 comments

  1. どせい Reply

    bash なら 『for i in `ls /work/hostname_aaa_*.txt`; do cp $i ${i//aaa/bbb}; done』 でもいけますかね

Leave a Comment

メールアドレスが公開されることはありません。