前回cpioを使ってエンディアン変換を行いました。
cpioは複数ファイルを扱えますので、一括でエンディアン変換することができます。
今回は複数ファイルのエンディアン変換です。
まず実験用ファイルをsplitで作ります。
takk@deb9:~/tmp/dir1$ seq 64 | perl -ne 'print chr' | split -db8 takk@deb9:~/tmp/dir1$ ls x00 x01 x02 x03 x04 x05 x06 x07 takk@deb9:~/tmp/dir1$
上のコマンドで生成したファイルの中身はこのようになっています。
takk@deb9:~/tmp/dir1$ for i in *;do echo -n $i:;od -td1 -An $i;done x00: 1 2 3 4 5 6 7 8 x01: 9 10 11 12 13 14 15 16 x02: 17 18 19 20 21 22 23 24 x03: 25 26 27 28 29 30 31 32 x04: 33 34 35 36 37 38 39 40 x05: 41 42 43 44 45 46 47 48 x06: 49 50 51 52 53 54 55 56 x07: 57 58 59 60 61 62 63 64 takk@deb9:~/tmp/dir1$
では、cpioでアーカイブを作りましょう。
takk@deb9:~/tmp/dir1$ find -type f | cpio -o > ../a.cpio 1 block takk@deb9:~/tmp/dir1$ cd ../ takk@deb9:~/tmp$ ls a.cpio dir1 takk@deb9:~/tmp$
最初に作った複数のファイルをまとめて、a.cpioというファイル名でアーカイブにしました。
このアーカイブをdir2というディレクトリを作成して、そこに展開してみます。
takk@deb9:~/tmp$ mkdir dir2 takk@deb9:~/tmp$ cd dir2 takk@deb9:~/tmp/dir2$ cat ../a.cpio | cpio -i 1 block takk@deb9:~/tmp/dir2$ ls x00 x01 x02 x03 x04 x05 x06 x07 takk@deb9:~/tmp/dir2$ !for for i in *;do echo -n $i:;od -td1 -An $i;done x00: 1 2 3 4 5 6 7 8 x01: 9 10 11 12 13 14 15 16 x02: 17 18 19 20 21 22 23 24 x03: 25 26 27 28 29 30 31 32 x04: 33 34 35 36 37 38 39 40 x05: 41 42 43 44 45 46 47 48 x06: 49 50 51 52 53 54 55 56 x07: 57 58 59 60 61 62 63 64 takk@deb9:~/tmp/dir2$
展開できました。元にファイルの内容と変化していないですね。
今度は、展開時に、-bオプションを指定して、4Byteエンディアン変換をします。
takk@deb9:~/tmp/dir2$ rm * takk@deb9:~/tmp/dir2$ ls takk@deb9:~/tmp/dir2$ cat ../a.cpio | cpio -ib 1 block takk@deb9:~/tmp/dir2$ !for for i in *;do echo -n $i:;od -td1 -An $i;done x00: 4 3 2 1 8 7 6 5 x01: 12 11 10 9 16 15 14 13 x02: 20 19 18 17 24 23 22 21 x03: 28 27 26 25 32 31 30 29 x04: 36 35 34 33 40 39 38 37 x05: 44 43 42 41 48 47 46 45 x06: 52 51 50 49 56 55 54 53 x07: 60 59 58 57 64 63 62 61 takk@deb9:~/tmp/dir2$
ものすごく楽に変換できました。
コメント