파일 내용 및 관리

cat head tail / grep / more less / diff / file / touch / tar / zip gzip bzip2

여기서는 파일의 내용이나 속성을 보고 또 필요하다면 관리하는 방법을 알아보자. 그리고 GNU/Linux의 고유 포맷이나 다른 시스템으로부터 가지고 온 포맷의 압축 파일 관리 요령도 다룰 것이다. 분량 관계로 제외시킨 내용은 텍스트 편집기 이용에 대한 것이다 - 이것은 내일 다루자.

파일의 내용에 대한 명령어들
$ cat [file] - 파일 내용 이어서 출력

more 명령, 또는 더 유용한 less 명령이 있다면 굳이 cat 명령을 기억할 필요가 없지만 - "고양이"라는 의미가 인상적인 건지 이상하게도 cat 명령어의 인지도가 more, less보다 더 높은 것 같다.[14] 그러나 고양이에겐 미안하지만, less 정도만 있으면 cat은 거의 필요없다.

$ cat long.txt |more                       # more long.txt와 같다.
$ less long.txt                         # 그냥 이렇게 기억하면 된다.
$ cat file1 file2 > all.files                # cat은 출력 즉시 종료되므로 이런 목적엔 적합

눈치챌 수 있듯이, moreless 명령은 파이프('|' 문자)를 통해 들어오는 입력을 받을 수도, 그리고 파일이름 자체를 처리할 수도 있다. 그리고 이들은 파일의 내용을 한 화면씩 잘라서 보여주며, 화면 전환 및 종료를 위한 키는 앞서 소개했던 man 또는 info 명령과 유사하다.

cat 명령이 필요없다면서도 자꾸만 들먹이게 되는데, 아무튼 이것처럼 파일 전체의 내용을 쏟아 보여주지 않고 각각 앞의 몇 줄 또는 뒤의 몇 줄을 보여주기 위한 명령으로 headtail도 있다. 기본적으로 앞(뒤)에서 10번째 줄 까지만 출력하지만 head -n 50 file.txt와 같이 이용해서 더 많은 줄 수를 출력할 수도 있다.

$ grep [string] [files...] - 문자열 찾기

여러 개의 파일의 내용 중에서 특정 문자열을 찾는 명령이다. 예를들어 다음과 같이 이용한다.

$ grep 씨퓨 file*.html               # file로 시작하는 모든 .html 파일에서
$ cat file*.html |grep 씨퓨 # 위와 똑같은 일을 한다.
$ ps aux |grep yoda             # ps aux의 결과에서 yoda가 포함된 모든 줄

처음 두 명령은 사실 cat 명령어의 쓸모 없음을 보여주는 유명한(?) 사례에 해당되는 것이다. 하지만 grep 명령어가 보다시피 파이프를 통해 입력을 받을 수도 있음을 주목하자. 세 번째 명령에서 이 기능의 쓰임새를 볼 수 있다. 이것은 시스템에서 실행 중인 모든 프로세스 중에서 yoda 이용자가 실행한 것만을 골라서 보여주는 명령이다.

$ diff [name1] [name2] - 다른 부분 찾기

두 파일을 비교해서 한 쪽에 있는데 다른 쪽에 없는 줄, 그리고 서로 다른 내용이 포함된 줄을 터미널로 쏟아내 보여준다. 두 파일에 아무 차이가 없다면 아무 것도 출력하지 않는다. 적당히 다른 두 파일을 가정하고, diff file1.txt file2.txt를 실행한 결과를 살펴보자.

$ diff file1.txt file2.txt

매우 부담스러운(?) 화면이지만 그래도 약간은 감이 잡힐 것이다. 0a1 이니 3c6 이니 6d10 이니 하는 소리는 바로 비교된 두 파일을 똑같이 만들기 위한 일종의 암호문이다. 문자 a는 add, c는 change, 그리고 d는 delete를 의미하며 좌우의 숫자는 각각 첫 번째 파일 및 두 번째 파일의 줄 번호다. (여러 줄에 걸친 '범위'일 때는 0a1,4 형식으로 - 즉 , 문자로 지정) 또한 >는 왼쪽에 없고 오른쪽에 있는 내용을, <는 반대인 경우를 보여준다. 따라서 3a5 표현 다음에는 >으로 시작하는 내용이 올 것이다. info diff; 인포 페이지의 도움말에 포함된 예제도 참고할 것!

$ file [file] - 파일의 속성 보기

이것은 지금껏 보아온 ls -l 명령과는 또다른 종류의 '자세한 정보'를 보여주는 명령이다. 말하자면 ls -l 명령이 파일이나 디렉토리에 대한 일반 정보를 자세히 보여주는데 비해, file [file] 명령은 파일의 종류와 고유한 속성에 대한 정보를 보여준다. 아래 실행 결과를 참고하는 것으로도 충분한 설명이 될 것이다.

$ file img-01.png
img-01.png: PNG image data, 1051 x 406, 16-bit/color RGB, non-interlaced
$ file soffice
soffice: Bourne shell script text executable
$ file /usr/share/magic
/usr/share/magic: magic text file for file(1) cmd

file 명령은 /usr/share/magic 파일에 정의되어 있는 규칙에 따라 파일의 속성을 판단한다 - 참고로 알고만 있자.

$ touch [file] - 파일을 살짝 건드리기

touch 명령은 빈 파일(크기가 0)을 새롭게 만들거나, 또는 이미 있는 파일의 몇 가지 정보를 바꾸는 명령이다. 예를들어 단순히 touch file.txt라고 하면 크기가 0인 file.txt를 새로 만든다. 이미 있는 파일일 경우, 특별한 옵션 없이 이용하면 기본적으로 그 파일의 변경시각을 '현재'로 바꾼다. touch 명령은 다음과 같이 동작한다.

$ ls -l file.txt
-rw-rw-r--    1 jedi jedi   100374  3월 26 12:22 file.txt
$ touch file.txt
-rw-rw-r--    1 jedi jedi   100374  8월 21 14:20 file.txt
$ date                  # 현재 날짜와 시각을 출력한다 - 비교해 볼 것!
$ touch -r file1.txt file2.txt ; ls -l file[1,2].txt

-r file 옵션은 현재 시각 대신 특정 파일의 것을 이용한다는 의미다. 즉 보기에서의 마지막 명령은 file2.txt의 변경시각을 file1.txt의 그것으로 '슬쩍 건드려' 바꾼다. 더 세부적인 동작은 man touch 명령으로 참고하라.

아카이브와 압축 관련 명령어들
$ tar [file] [sources...] - 아카이브 파일 관리

tar 명령어는 manetic Tape ARchiving이라는, 선사시대의(?) 기술에서 비롯되었다. 이 기술은 자기 테이프를 두루말이 화장지처럼 말아서 플라스틱 케이스에 넣고, 이것을 앞뒤로 돌려가며 최대 수 백 MegaBytes라는 엄청난 데이터를 읽고 쓸 수 있도록 하는 것이다. 이 기술은 태초의 펀칭 머신(종이에 구멍을 뚫어 기록하던) 방식에 비해 혁명적인 진보였으며, 역사는 사실상 이 자기 테잎 장치로부터 시작되었다는 평가가 고고학계의 일반적인 의견이다 :-) [15] 서문이 너무 길었는데, 아무튼 이 tar 명령어는 테잎 저장장치에 그대로 저장할 수 있도록 여러 개의 파일과 디렉토리를 "하나의" *.tar 파일로 풀어 헤치는 일을 한다. 그리고 일반적으로 이 타르 파일에 대해 압축명령을 해서 압축파일을 만든다.

이 명령어의 가장 전형적인 이용 사례는 하나의 디렉토리를 해체해서 하나의 타르 파일로 만드는 것이다. 또한 곧 다룰 압축명령을 옵션의 하나로 함께 해줄 수도 있다. 전형적인 이용은 다음과 같다.

$ tar -cf thing-1.tar thing-1/             # tar 파일 이름 - 관례임!
$ tar -zcf thing-2.tar.gz thing-2/      # tar 파일을 만들어 gzip으로 압축
$ tar -jcf thing-3.tar.bz2 thing-3/     # (더 압축율이 높은) bzip2로 압축
$ file thing-?.*                        # 이들의 속성을 확인하고,
$ ls -l thing-?.*                       # 크기도 확인해 보자.

타르 파일의 이름을 디렉토리 이름에 .tar 확장자를 붙여서 결정하는 관례를 기억하자! thing-?.* 표현이 무엇을 의미하는지는 잘 기억하리라 믿는다. 그리고 이번에는 TAR와 관련된 아카이브 및 압축파일을 풀어내 보자.

$ rm -fr thing-?/         # 원래 디렉토리들 삭제 - 걱정 말 것 :-)
$ tar -xvf thing-1.tar          # -v 옵션은 풀리는 파일의 목록을 출력
$ tar -xvzf thing-2.tar.gz      # -z 옵션은 gzip 압축에 대해,
$ tar -xvjf thing-3.tar.bz2     # -j 옵션은 bzip2 압축에 대해 이용
TGZ / TBZ2(TBZ) 확장자

이들은 각각 tar.gz 및 tar.bz2 확장자를 줄여쓴 것이다. 종종 이런 파일과 만나더라도 당황하지 말고 위와 똑같이 명령하자.

$ gzip [name] - 파일 압축 및 풀기

위의 tar 명령에서도 언급되었듯이, gzipbzip2 명령은 파일을 실제로 압축하고 해제하기 위해 쓰인다. 현재로서 더 많이 이용되는 것은 gzip, 하지만 압축율이 높아 점점 많이 이용되고 있는 것은 bzip2이다. 먼저 gzip으로 압축파일을 다루는 간단한 보기는 다음과 같다.

$ gzip file.txt                        # 압축
$ gzip -d file.txt.gz           # 풀기; -d 옵션은 --decompress와 같음
$ gunzip file.txt.gz            # '-'를 싫어하는(?) 사람을 위한 또다른 풀기 명령

위에서 눈여겨 볼 것은, 특별히 옵션을 지정하지 않으면 기본적으로 .gz 확장자가 붙는다는 사실이다. 가능하면 확장자명을 바꾸려고 들지 말자. bzip2 명령도 다음과 같이 유사한 사용법을 보인다.

$ bzip2 file.txt          # 압축 (gzip의 경우와 크기 비교도 해보자!)
$ bzip2 -d file.txt.bz2         # 풀기; -d 옵션은 gzip과 마찬가지다.
$ bunzip2 file.txt.bz2          # 많은 명령어가 이렇게 - 일관성(?) 있다 :-)

특별한 의도가 아니라면 하나의 파일에 대해서는 그냥 압축만 해서 남들에게 제공하고, 많은 파일과 디렉토리를 포함하는 경우엔 앞서 다룬 tar로써 별도의 디렉토리를 만들어 주도록 하자. 압축을 풀었더니 수많은 파일이 현재 디렉토리에 쏟아져서, 도대체 원래 현재 디렉토리에 있던 파일들과 구별이 안되는 상황은 - 당해보면 알 것이다!

MS-Windows에서 온 압축 파일?

극소수 희한한(독점적이기까지 한) 포맷만 아니라면 압축 파일을 각 시스템에서 서로 주고 받을 수 있다. 특히 zip이나 rar 포맷은 대부분 GNU/Linux 시스템에 설치되어 있을 zip / unzip, 그리고 rar / unrar 명령으로 다루는데 무리가 없다.

기술적으로는 아무 문제가 없음에도 현실적으로 종종 접하는 문제가 있긴 하다; 확장자를 무식하게(?) ZIP, 즉 대문자로 도배한다거나, 또는 압축을 풀었더니 새 디렉토리가 생성되지 않고 현재 디렉토리에 수많은 내용물이 쏟아져 버리는 등의 :-(



[14] 사실 cat은 concatenate, 즉 줄줄이 잇는다는 말에서 나왔다.

[15] 자연과학대 6층에 있는 물리학과 컴퓨터 박물관에 찾아오면 실물을 구경할 수 있을 것이다!