フォルダ名をファイル名に含ませる(その3)

前回は1行Perlで置換スクリプト生成をしました。
これです。

takk@deb9:~/tmp$ cat base | perl -nE'chomp;$n=$_;/^(.*\/)/;say"$_ $1 $n"'

まあ1行ならなんとか覚えられそうと思ってたのですが、やっぱり、記号が多くて打ち間違いしそうです。しかも、毎回頭の中でこの1行と同じものが作れるか分かりません。それはそれで頭の体操にはなりますが、仕事中に、何度もミスってたら、お客さんも、大丈夫か、この人、となりますね。

今回は、いろんなコマンドの組み合わせで、1行スクリプトにしてみます。

まずは、pasteコマンド。単純にテキストを横並びに結合できるので、使わない手はありません。

takk@deb9:~/tmp$ paste base base
./gmp-6.1.2+dfsg/mpn/x86_64/aors_n.asm  ./gmp-6.1.2+dfsg/mpn/x86_64/aors_n.asm
./gmp-6.1.2+dfsg/tune/set_strs.c        ./gmp-6.1.2+dfsg/tune/set_strs.c
./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1/sqr_diagonal.asm      ./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1/sqr_diagonal.asm
./gmp-6.1.2+dfsg/mpn/x86/fat/mod_1.c    ./gmp-6.1.2+dfsg/mpn/x86/fat/mod_1.c
./gmp-6.1.2+dfsg/mini-gmp/mini-gmp.h    ./gmp-6.1.2+dfsg/mini-gmp/mini-gmp.h
./gmp-6.1.2+dfsg/mpn/lisp       ./gmp-6.1.2+dfsg/mpn/lisp
./gmp-6.1.2+dfsg/mpf/out_str.c  ./gmp-6.1.2+dfsg/mpf/out_str.c
./gmp-6.1.2+dfsg/mpn/x86/k7/gmp-mparam.h        ./gmp-6.1.2+dfsg/mpn/x86/k7/gmp-mparam.h
./gmp-6.1.2+dfsg/mpz/aorsmul.c  ./gmp-6.1.2+dfsg/mpz/aorsmul.c
./gmp-6.1.2+dfsg/cxx/osmpz.cc   ./gmp-6.1.2+dfsg/cxx/osmpz.cc
takk@deb9:~/tmp$

次に、tr。置換できるのはsedばかりではありません。/の置換などは、trの方が見やすいです。

takk@deb9:~/tmp$ tr / _ <base
._gmp-6.1.2+dfsg_mpn_x86_64_aors_n.asm
._gmp-6.1.2+dfsg_tune_set_strs.c
._gmp-6.1.2+dfsg_mpn_sparc32_ultrasparct1_sqr_diagonal.asm
._gmp-6.1.2+dfsg_mpn_x86_fat_mod_1.c
._gmp-6.1.2+dfsg_mini-gmp_mini-gmp.h
._gmp-6.1.2+dfsg_mpn_lisp
._gmp-6.1.2+dfsg_mpf_out_str.c
._gmp-6.1.2+dfsg_mpn_x86_k7_gmp-mparam.h
._gmp-6.1.2+dfsg_mpz_aorsmul.c
._gmp-6.1.2+dfsg_cxx_osmpz.cc
takk@deb9:~/tmp$

次にcut。コマンドはいろんなものがあるので、ふんだんに使いましょう。

takk@deb9:~/tmp$ tr / _ <base | cut -b3-
gmp-6.1.2+dfsg_mpn_x86_64_aors_n.asm
gmp-6.1.2+dfsg_tune_set_strs.c
gmp-6.1.2+dfsg_mpn_sparc32_ultrasparct1_sqr_diagonal.asm
gmp-6.1.2+dfsg_mpn_x86_fat_mod_1.c
gmp-6.1.2+dfsg_mini-gmp_mini-gmp.h
gmp-6.1.2+dfsg_mpn_lisp
gmp-6.1.2+dfsg_mpf_out_str.c
gmp-6.1.2+dfsg_mpn_x86_k7_gmp-mparam.h
gmp-6.1.2+dfsg_mpz_aorsmul.c
gmp-6.1.2+dfsg_cxx_osmpz.cc
takk@deb9:~/tmp$

たいていのコマンドは、-で標準入力を使うことができます。pasteも例外ではありません。区切り文字もタブ以外で指定できます。

takk@deb9:~/tmp$ tr / _ <base | cut -b3- | paste -d/ base -
./gmp-6.1.2+dfsg/mpn/x86_64/aors_n.asm/gmp-6.1.2+dfsg_mpn_x86_64_aors_n.asm
./gmp-6.1.2+dfsg/tune/set_strs.c/gmp-6.1.2+dfsg_tune_set_strs.c
./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1/sqr_diagonal.asm/gmp-6.1.2+dfsg_mpn_sparc32_ultrasparct1_sqr_diagonal.asm
./gmp-6.1.2+dfsg/mpn/x86/fat/mod_1.c/gmp-6.1.2+dfsg_mpn_x86_fat_mod_1.c
./gmp-6.1.2+dfsg/mini-gmp/mini-gmp.h/gmp-6.1.2+dfsg_mini-gmp_mini-gmp.h
./gmp-6.1.2+dfsg/mpn/lisp/gmp-6.1.2+dfsg_mpn_lisp
./gmp-6.1.2+dfsg/mpf/out_str.c/gmp-6.1.2+dfsg_mpf_out_str.c
./gmp-6.1.2+dfsg/mpn/x86/k7/gmp-mparam.h/gmp-6.1.2+dfsg_mpn_x86_k7_gmp-mparam.h
./gmp-6.1.2+dfsg/mpz/aorsmul.c/gmp-6.1.2+dfsg_mpz_aorsmul.c
./gmp-6.1.2+dfsg/cxx/osmpz.cc/gmp-6.1.2+dfsg_cxx_osmpz.cc
takk@deb9:~/tmp$

そして、paseを二段構えにして、最後にsedで置換をすればできあがりです。

takk@deb9:~/tmp$ tr / _ <base | cut -b3- | paste -d/ base - | paste base - | sed 's/^/mv /'
mv ./gmp-6.1.2+dfsg/mpn/x86_64/aors_n.asm       ./gmp-6.1.2+dfsg/mpn/x86_64/aors_n.asm/gmp-6.1.2+dfsg_mpn_x86_64_aors_n.asm
mv ./gmp-6.1.2+dfsg/tune/set_strs.c     ./gmp-6.1.2+dfsg/tune/set_strs.c/gmp-6.1.2+dfsg_tune_set_strs.c
mv ./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1/sqr_diagonal.asm   ./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1/sqr_diagonal.asm/gmp-6.1.2+dfsg_mpn_sparc32_ultrasparct1_sqr_diagonal.asm
mv ./gmp-6.1.2+dfsg/mpn/x86/fat/mod_1.c ./gmp-6.1.2+dfsg/mpn/x86/fat/mod_1.c/gmp-6.1.2+dfsg_mpn_x86_fat_mod_1.c
mv ./gmp-6.1.2+dfsg/mini-gmp/mini-gmp.h ./gmp-6.1.2+dfsg/mini-gmp/mini-gmp.h/gmp-6.1.2+dfsg_mini-gmp_mini-gmp.h
mv ./gmp-6.1.2+dfsg/mpn/lisp    ./gmp-6.1.2+dfsg/mpn/lisp/gmp-6.1.2+dfsg_mpn_lisp
mv ./gmp-6.1.2+dfsg/mpf/out_str.c       ./gmp-6.1.2+dfsg/mpf/out_str.c/gmp-6.1.2+dfsg_mpf_out_str.c
mv ./gmp-6.1.2+dfsg/mpn/x86/k7/gmp-mparam.h     ./gmp-6.1.2+dfsg/mpn/x86/k7/gmp-mparam.h/gmp-6.1.2+dfsg_mpn_x86_k7_gmp-mparam.h
mv ./gmp-6.1.2+dfsg/mpz/aorsmul.c       ./gmp-6.1.2+dfsg/mpz/aorsmul.c/gmp-6.1.2+dfsg_mpz_aorsmul.c
mv ./gmp-6.1.2+dfsg/cxx/osmpz.cc        ./gmp-6.1.2+dfsg/cxx/osmpz.cc/gmp-6.1.2+dfsg_cxx_osmpz.cc
takk@deb9:~/tmp$

コマンドを駆使する方法の方が、直観的にパイプでつなげていくことができますね。これなら毎回迷うことなくすっと書けそうです。

コメント

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