ファイル名の変更と、そのファイルを使っているファイル中の文字列の置換です。このブログの電子工作で使っているbreadレポジトリが実験対象です。
今breadのディレクトリ構成は以下のようになっています。
takk@deb83:~/bread$ tree . ├── bread.sh ├── mcu │ └── avr │ ├── attiny2313 │ │ ├── breadboard.sh │ │ ├── device │ │ │ ├── 7seg-4digit │ │ │ │ ├── hello.c │ │ │ │ └── makefile │ │ │ ├── a-3880eg │ │ │ │ ├── hello.c │ │ │ │ └── makefile │ │ │ ├── c-7seg │ │ │ │ ├── hello.c │ │ │ │ └── makefile │ │ │ └── tc1602e-13a │ │ │ ├── breadboard.sh │ │ │ ├── makefile │ │ │ └── test.c │ │ ├── makefile │ │ └── test.c │ ├── attiny26 │ │ ├── breadboard.sh │ │ ├── hello.c │ │ └── makefile │ └── attiny85 │ ├── breadboard.sh │ ├── makefile │ └── test.c └── sample.sh 10 directories, 20 files
makefileが存在する各ディレクトリでビルドができるようになっていますが、ソースファイル名が、test.cだったり、hello.cだったりと統一されていません。これをすべてhello.cへ変更したいと思います。
まずは、testという単語を使っているファイルを探します。
takk@deb83:~/bread$ grep -rl test * mcu/avr/attiny2313/makefile mcu/avr/attiny2313/device/tc1602e-13a/makefile mcu/avr/attiny85/makefile takk@deb83:~/bread$
3件見つかりました。
これらのファイルで使っているtestをhelloに置換します。gitで管理しているのでファイルはいつでも戻せます。思い切って置換します。
takk@deb83:~/bread$ sed 's/test/hello/g' -i `!!` sed 's/test/hello/g' -i `grep -rl test *` takk@deb83:~/bread$
うまく置換できたか、git上でdiffします。
takk@deb83:~/bread$ git diff diff --git a/mcu/avr/attiny2313/device/tc1602e-13a/makefile b/mcu/avr/attiny2313 /device/tc1602e-13a/makefile index 39e1efe..159a117 100644 --- a/mcu/avr/attiny2313/device/tc1602e-13a/makefile +++ b/mcu/avr/attiny2313/device/tc1602e-13a/makefile @@ -1,11 +1,11 @@ -test: test.c - avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o test.o test.c - avr-gcc -O2 -mmcu=attiny2313 test.o -o test - avr-objcopy -j .text -j .data -O ihex test test.hex +hello: hello.c + avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c + avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello + avr-objcopy -j .text -j .data -O ihex hello hello.hex (省略) -testwrite: - avrdude -p t85 -c linuxgpio -U flash:w:test.hex;echo DONE +hellowrite: + avrdude -p t85 -c linuxgpio -U flash:w:hello.hex;echo DONE clean: - rm test.o test.hex test + rm hello.o hello.hex hello
一点追加で置換したいものが見つかりました。testwriteがhellowriteになりましたが、ただのwriteに統一したいです。
同じように置換します。
takk@deb83:~/bread$ grep -rl hellowrite * mcu/avr/attiny2313/makefile mcu/avr/attiny85/makefile takk@deb83:~/bread$ sed 's/hellowrite/write/g' -i `!!` sed 's/hellowrite/write/g' -i `grep -rl hellowrite *` takk@deb83:~/bread$
すべてwriteという単語に変わったか確認します。統一できたようです。
takk@deb83:~/bread$ grep -r write * mcu/avr/attiny26/makefile:write: mcu/avr/attiny2313/makefile:write: mcu/avr/attiny2313/device/a-3880eg/makefile:write: mcu/avr/attiny2313/device/c-7seg/makefile:write: mcu/avr/attiny2313/device/tc1602e-13a/makefile:write: mcu/avr/attiny2313/device/7seg-4digit/makefile:write: mcu/avr/attiny85/makefile:write: takk@deb83:~/bread$
次に、git管理のファイル名を変更しますが、mvコマンドではなく、git mvを使います。
ファイル名変更の対象であるtest.cを探します。
takk@deb83:~/bread$ find -name test.c ./mcu/avr/attiny2313/test.c ./mcu/avr/attiny2313/device/tc1602e-13a/test.c ./mcu/avr/attiny85/test.c takk@deb83:~/bread$
git mvで置換します。
takk@deb83:~/bread$ for i in `find -name test.c`;do git mv $i ${i//test/hello};done takk@deb83:~/bread$
git statusを見てみましょう。
takk@deb83:~/bread$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: mcu/avr/attiny2313/device/tc1602e-13a/test.c -> mcu/avr/attiny2313/device/tc1602e-13a/hello.c renamed: mcu/avr/attiny2313/test.c -> mcu/avr/attiny2313/hello.c renamed: mcu/avr/attiny85/test.c -> mcu/avr/attiny85/hello.c Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: mcu/avr/attiny2313/device/tc1602e-13a/makefile modified: mcu/avr/attiny2313/makefile modified: mcu/avr/attiny85/makefile takk@deb83:~/bread$
ではまとめてaddします。
takk@deb83:~/bread$ git add * takk@deb83:~/bread$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: mcu/avr/attiny2313/device/tc1602e-13a/test.c -> mcu/avr/attiny2313/device/tc1602e-13a/hello.c modified: mcu/avr/attiny2313/device/tc1602e-13a/makefile renamed: mcu/avr/attiny2313/test.c -> mcu/avr/attiny2313/hello.c modified: mcu/avr/attiny2313/makefile renamed: mcu/avr/attiny85/test.c -> mcu/avr/attiny85/hello.c modified: mcu/avr/attiny85/makefile takk@deb83:~/bread$
コミット。
takk@deb83:~/bread$ git commit [master 74a0da6] s/test/hello/g 6 files changed, 20 insertions(+), 20 deletions(-) rename mcu/avr/attiny2313/device/tc1602e-13a/{test.c => hello.c} (100%) rename mcu/avr/attiny2313/{test.c => hello.c} (100%) rename mcu/avr/attiny85/{test.c => hello.c} (100%) takk@deb83:~/bread$
push後、再度cloneして確認します。
takk@deb83:~$ git clone https://github.com/takkete/bread.git Cloning into 'bread'... remote: Counting objects: 95, done. remote: Compressing objects: 100% (16/16), done. remote: Total 95 (delta 2), reused 0 (delta 0), pack-reused 77 Unpacking objects: 100% (95/95), done. Checking connectivity... done. takk@deb83:~$ cd bread takk@deb83:~/bread$
treeを確認。
takk@deb83:~/bread$ tree . ├── bread.sh ├── mcu │ └── avr │ ├── attiny2313 │ │ ├── breadboard.sh │ │ ├── device │ │ │ ├── 7seg-4digit │ │ │ │ ├── hello.c │ │ │ │ └── makefile │ │ │ ├── a-3880eg │ │ │ │ ├── hello.c │ │ │ │ └── makefile │ │ │ ├── c-7seg │ │ │ │ ├── hello.c │ │ │ │ └── makefile │ │ │ └── tc1602e-13a │ │ │ ├── breadboard.sh │ │ │ ├── hello.c │ │ │ └── makefile │ │ ├── hello.c │ │ └── makefile │ ├── attiny26 │ │ ├── breadboard.sh │ │ ├── hello.c │ │ └── makefile │ └── attiny85 │ ├── breadboard.sh │ ├── hello.c │ └── makefile └── sample.sh 10 directories, 20 files takk@deb83:~/bread$
makefileが存在するディレクトリすべてmakeを実行して確認します。
takk@deb83:~/bread$ for i in `find -name makefile`;do (cd `dirname $i`;make);done avr-gcc -O2 -mmcu=attiny26 -DF_CPU=1000000UL -c -o hello.o hello.c avr-gcc -O2 -mmcu=attiny26 hello.o -o hello avr-objcopy -j .text -j .data -O ihex hello hello.hex avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello avr-objcopy -j .text -j .data -O ihex hello hello.hex avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello avr-objcopy -j .text -j .data -O ihex hello hello.hex avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello avr-objcopy -j .text -j .data -O ihex hello hello.hex avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello avr-objcopy -j .text -j .data -O ihex hello hello.hex avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello avr-objcopy -j .text -j .data -O ihex hello hello.hex avr-gcc -O2 -mmcu=attiny85 -DF_CPU=1000000UL -c -o hello.o hello.c avr-gcc -O2 -mmcu=attiny85 hello.o -o hello avr-objcopy -j .text -j .data -O ihex hello hello.hex takk@deb83:~/bread$
成功しました。
コメント