フォルダ名をファイル名に含ませる


アニメ『ソードアート・オンライン アリシゼーション』

ネタが尽きないもんですねえ。すごく面白い。ダイブしている時に、現実を忘れてるってのがいいです。非現実の世界でもリセットがきかないものとして真剣に過ごした方が絶対楽しいと思うんですよね。夢の中でも真剣、遊びも仕事も真剣の方が面白い。

そろそろgccやgmpのビルドに飽き始めたので、脱線します。
GMPのディレクトリを見ていて過去のプロジェクトのことを思い出しました。

GMPのディレクトリ構成をランダムにピックアップすると、こんな感じですが、

takk@deb9:~/tmp$ find | shuf | head
./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$

以前係ったプロジェクトで、ファイル名には必ずフォルダの名前を入れないといけないルールってのがありました。
ほえ?

さきほどピックアップしたディレクトリ一覧を例にすると、こんな感じになるわけです。

./gmp-6.1.2+dfsg/mpn/x86_64/gmp-6.1.2+dfsg_mpn_x86_64_aors_n.asm
./gmp-6.1.2+dfsg/tune/gmp-6.1.2+dfsg_tune_set_strs.c
./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1/gmp-6.1.2+dfsg_mpn_sparc32_ultrasparct1_sqr_diagonal.asm
./gmp-6.1.2+dfsg/mpn/x86/fat/gmp-6.1.2+dfsg_mpn_x86_fat_mod_1.c
./gmp-6.1.2+dfsg/mini-gmp/gmp-6.1.2+dfsg_mini-gmp_mini-gmp.h
./gmp-6.1.2+dfsg/mpn/gmp-6.1.2+dfsg_mpn_lisp
./gmp-6.1.2+dfsg/mpf/gmp-6.1.2+dfsg_mpf_out_str.c
./gmp-6.1.2+dfsg/mpn/x86/k7/gmp-6.1.2+dfsg_mpn_x86_k7_gmp-mparam.h
./gmp-6.1.2+dfsg/mpz/gmp-6.1.2+dfsg_mpz_aorsmul.c
./gmp-6.1.2+dfsg/cxx/gmp-6.1.2+dfsg_cxx_osmpz.cc

まあ、非常にばからしいのですが、時には従わねばならない時もあります。

フォルダ名をファイル名に入れるのは、機械的にできますが、その時のPMはあろうことか、各ファイル担当者の責任で変更しろと言ってきたので、そりゃ大変。
皆一個一個ファイル名を変更していくわけです。F2キーを押して。

こんな時に、使えるスクリプトを考えてみましょう。

元のディレクトリとファイル名はこのように仮定します。

takk@deb9:~/tmp$ cat 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$

最初に、ファイル名をカットして、ディレクトリの一覧だけを作ります。dirnameを使います。

takk@deb9:~/tmp$ cat base | xargs dirname | tee a1
./gmp-6.1.2+dfsg/mpn/x86_64
./gmp-6.1.2+dfsg/tune
./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1
./gmp-6.1.2+dfsg/mpn/x86/fat
./gmp-6.1.2+dfsg/mini-gmp
./gmp-6.1.2+dfsg/mpn
./gmp-6.1.2+dfsg/mpf
./gmp-6.1.2+dfsg/mpn/x86/k7
./gmp-6.1.2+dfsg/mpz
./gmp-6.1.2+dfsg/cxx
takk@deb9:~/tmp$

次に、ディレクトリ名を含んだファイル名にするために、/を_に置換した一覧を作ります。

takk@deb9:~/tmp$ sed 's/\//_/g' base | tee a2
._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$

a1とa2を結合します。

takk@deb9:~/tmp$ paste -d/ a1 a2 | tee after
./gmp-6.1.2+dfsg/mpn/x86_64/._gmp-6.1.2+dfsg_mpn_x86_64_aors_n.asm
./gmp-6.1.2+dfsg/tune/._gmp-6.1.2+dfsg_tune_set_strs.c
./gmp-6.1.2+dfsg/mpn/sparc32/ultrasparct1/._gmp-6.1.2+dfsg_mpn_sparc32_ultrasparct1_sqr_diagonal.asm
./gmp-6.1.2+dfsg/mpn/x86/fat/._gmp-6.1.2+dfsg_mpn_x86_fat_mod_1.c
./gmp-6.1.2+dfsg/mini-gmp/._gmp-6.1.2+dfsg_mini-gmp_mini-gmp.h
./gmp-6.1.2+dfsg/mpn/._gmp-6.1.2+dfsg_mpn_lisp
./gmp-6.1.2+dfsg/mpf/._gmp-6.1.2+dfsg_mpf_out_str.c
./gmp-6.1.2+dfsg/mpn/x86/k7/._gmp-6.1.2+dfsg_mpn_x86_k7_gmp-mparam.h
./gmp-6.1.2+dfsg/mpz/._gmp-6.1.2+dfsg_mpz_aorsmul.c
./gmp-6.1.2+dfsg/cxx/._gmp-6.1.2+dfsg_cxx_osmpz.cc
takk@deb9:~/tmp$

最後に元の一覧と、変更後の一覧を結合して、頭にmvをつけます。

takk@deb9:~/tmp$ paste -d' ' base after | sed 's/^/mv /'
mv ./gmp-6.1.2+dfsg/mpn/x86_64/aors_n.asm ./gmp-6.1.2+dfsg/mpn/x86_64/._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/._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/._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/._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/._gmp-6.1.2+dfsg_mini-gmp_mini-gmp.h
mv ./gmp-6.1.2+dfsg/mpn/lisp ./gmp-6.1.2+dfsg/mpn/._gmp-6.1.2+dfsg_mpn_lisp
mv ./gmp-6.1.2+dfsg/mpf/out_str.c ./gmp-6.1.2+dfsg/mpf/._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-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/._gmp-6.1.2+dfsg_mpz_aorsmul.c
mv ./gmp-6.1.2+dfsg/cxx/osmpz.cc ./gmp-6.1.2+dfsg/cxx/._gmp-6.1.2+dfsg_cxx_osmpz.cc
takk@deb9:~/tmp$

これで置換スクリプトはできますが、真剣に仕事をするならば、こんなものを作らなければならないプロジェクトとは早くおさらばする方がが良いかもしれません。