Tilde Expansion

~ 문자를 이용하여 디렉토리 정보를 표시합니다. double quotes 내에서는 확장되지 않습니다.

Home 디렉토리

~ 는 현재 사용자의 홈 디렉토리를 나타냅니다. $HOME 변수값과 같습니다.
~USERID 는 USERID 의 홈 디렉토리를 나타냅니다.

$ echo ~          # 현재 사용자의 홈 디렉토리를 나타냅니다.
/home/mug896

$ echo ~man       # 'man' 사용자의 홈 디렉토리를 나타냅니다.
/var/cache/man

root$ cp ~userA/file.txt ~usrB/     # userA 의 홈 디렉토리에서 file.txt 파일을
                                    # userB 의 홈 디렉토리로 복사

현재 디렉토리

~+ 는 현재 디렉토리를 나타내며 $PWD 변수값과 같습니다. ( bash 전용 )

이전 디렉토리

~- 는 이전 디렉토리를 나타내며 $OLDPWD 변수값과 같습니다. ( bash 전용 )

Quiz

binary 파일을 hex 로 변경하여 저장하고 다시 hex 파일을 binary 파일로 만들려면 어떻게 할까요?

/bin/date 를 대상으로 hex 변환에 od 명령을, 복구에 xxd 명령을 사용하겠습니다.

# binary 를 hex 로 변환
# od 명령의 -v 옵션은 같은 내용의 라인이 연이어 출력될 경우 '*' 로 표시되는 것을 방지합니다.
$ od -v -An -tx1 /bin/date > date.hex
# 또는
$ xxd -p /bin/date > date.hex

$ head -2 date.hex
 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
 03 00 3e 00 01 00 00 00 a0 37 00 00 00 00 00 00

# hex 파일을 다시 binary 로 변환
$ xxd -r -p date.hex > date2

# 원본 binary 와 비교
$ cmp /bin/date date2

$ echo $?
0
.....................................................

$ cmp /bin/date <(od -v -An -tx1 /bin/date | xxd -r -p)

$ echo $?
0

파일의 특정 offset 에서부터 N 바이트 hex 추출

# offset 2 에서부터 4 바이트 hex 추출 ( od 명령은 옵션 값으로 8, 16 진수 모두 사용 가능 )
$ echo ABCDEFGHIJK | od -j2 -N4 -tx1z
0000002 43 44 45 46                                      >CDEF<
0000006

$ echo ABCDEFGHIJK | hd -s2 -n4
00000002  43 44 45 46                                     |CDEF|
00000006

hex 값이 아닌 정수나 float 값으로 출력하고 싶으면                                                 ( 참조: hex 에디팅 )

# 8 바이트 건너뛰고(-j8), 8 바이트를 읽음(-N8), 각각 4 바이트씩을 signed decimal 로 처리(-td4) 
# x86 cpu 는 little endian 이므로 03 00 00 00 값이 정수값으로 처리될 때는
# 작은쪽(little) 주소의 바이트 값이 숫자 끝으로(endian) 오게 돼서 0x00000003 이 됩니다.
$ od -j8 -N8 -td4 binary
0000010           3           4
0000020

# 16 바이트를 읽어들이고(-N16) 각각 8 바이트를 unsinged deciaml 로 처리(-tu8)
$ od -j16 -N16 -tu8 binary
0000020                    5                    6
0000040

# 4 바이트를 읽어들이고(-N4) 각각 2 바이트를 unsinged deciaml 로 처리(-tu2)
$ od -j32 -N4 -tu2 binary
0000040      7      8
0000044

2 .

파일 A 의 특정 위치에서 바이트를 추출해서 파일 B 의 특정 위치에 쓰기를 하려면 어떻게 할까요?

이때는 dd 명령과 conv=notruc 옵션을 사용합니다.

$ cat infile                      $ cat outfile 
1111111111                        aaaaaaaaaaaaaaaaaaaa
2222222222                        bbbbbbbbbbbbbbbbbbbb
3333333333                        cccccccccccccccccccc
1234567890                        dddddddddddddddddddd
                                  eeeeeeeeeeeeeeeeeeee

# 1. infile 에서 11 * 3 bytes 를 skip 한 위치에서 바이트를 읽어들입니다.
# 2. outfile 에서 21 * 2 bytes 건너뛴( seek ) 위치에 바이트를 쓰기 합니다.
# 3. 읽기, 쓰기 할때 block size 는 1 byte 로 하고 10 회 쓰기 합니다.
# 4. conv=notrunc 옵션은 파일에 쓰기를 할때 파일이 truncate 되지 않게 합니다.
$ dd if=infile skip=$(( 11*3 )) of=outfile seek=$(( 21*2 )) bs=1 count=10 conv=notrunc
10+0 records in
10+0 records out
10 bytes copied, 0.000742817 s, 13.5 kB/s

$ cat outfile 
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
1234567890cccccccccc
dddddddddddddddddddd
eeeeeeeeeeeeeeeeeeee

dd 명령은 파일뿐만 아니라 device 장치 파일에도 동일하게 적용할 수 있습니다.

# /dev/sda 디스크의 MBR 를 sdambr.img 파일로 백업
$ sudo dd if=/dev/sda of=sdambr.img bs=512 count=1
# sdambr.img 파일로 부터 MBR 복구
$ sub dd if=sdambr.img of=/dev/sda

# 다음과 같이 하면 부팅 가능한 우분투 USB 가 만들어집니다. ( usb 는 /dev/sdb )
$ sudo dd if=ubuntu-desktop-amd64.iso of=/dev/sdb bs=1M oflag=direct status=progress