본문 바로가기
오픈소스SW

리눅스 명령어 기초 2 - 파일/디렉토리 관련 명령어

by sepang 2021. 9. 2.

이전 게시글에서는 리눅스 쉘을 사용할 때 가장 기본이 되는 명령어들을 살펴봤다. 이번 포스팅에서는 '파일'과 관련된 명령어를 집중해서 살펴보자.

cp (파일이름) (경로)

sepang@ubuntu:~$ ls
Desktop  Documents  Music     Public  Templates  Videos
dir1     Downloads  Pictures  snap    test.c
sepang@ubuntu:~$ cp test.c dir1
sepang@ubuntu:~$ cd dir1
sepang@ubuntu:~/dir1$ ls
test.c

현재 디렉토리에 있는 파일을 다른 경로로 복사한다. 위에는 home 디렉토리에 위치한 test.c라는 파일을 dir1이라는 디렉토리에 복사한 것이다. 그러면 폴더를 복사하려면 어떻게 해야할까?

cp -r (디렉토리 이름) (경로)

이전 포스트의 rm-r과 유사하다. -r 옵션을 이용함으로써 첫번째 인자의 디렉토리 자체를 복사하여 두번째 인자값의 경로로 이동시킨다. 만약 두번째 인자에 넣어준 이름을 가지는 디렉토리가 존재하지 않으면 해당 이름을 가진 디렉토리를 생성하고 그 안에 내용을 복사한 내용들을 넣는다.

mv (파일이름) (경로) or (파일or폴더이름) (변경할 파일or폴더이름)

sepang@ubuntu:~$ ls
Desktop  Documents  Music     Public  Templates  Videos
dir1     Downloads  Pictures  snap    test.c
sepang@ubuntu:~$ mv test.c hello.c
sepang@ubuntu:~$ ls
Desktop  Documents  hello.c  Pictures  snap       Videos
dir1     Downloads  Music    Public    Templates

복사와 유사하지만 파일을 복사가 아닌 이동시킨다. 그리고 해당 명령어는 '파일(폴더)이름 변경'이라는 한가지 사용법이 더 있다. 두번째 인자를 경로가 아닌 변경할 파일(폴더)이름을 입력하면 파일 이름이 변경되는 것을 확인할 수 있다.

cat (파일이름) ...

sepang@ubuntu:~$ cat hello.c
#include <stdio.h>
int main()
{
	printf("Hello World\n");
	return 0;
}

파일의 내용을 간단하게 출력하는데 사용된다. 파일 이름을 연달아 입력하면 두개 이상의 파일 내용을 동시에 출력할 수도 있다.

grep (내용) (파일이름)

epang@ubuntu:~$ grep 0 hello.c
	return 0;

파일에서 해당 내용을 가지는 행을 출력한다. 예시에서는 hello.c 파일에서 '0'이라는 문자가 있는 행을 출력하였다.

od

epang@ubuntu:~$ od hello.c
0000000 064443 061556 072554 062544 036040 072163 064544 027157
0000020 037150 064412 072156 066440 064541 024156 005051 005173
0000040 070011 064562 072156 024146 044042 066145 067554 053440
0000060 071157 062154 067134 024442 005073 071011 072145 071165
0000100 020156 035460 076412 000012
0000107
sepang@ubuntu:~$ od -x hello.c
0000000 6923 636e 756c 6564 3c20 7473 6964 2e6f
0000020 3e68 690a 746e 6d20 6961 286e 0a29 0a7b
0000040 7009 6972 746e 2866 4822 6c65 6f6c 5720
0000060 726f 646c 6e5c 2922 0a3b 7209 7465 7275
0000100 206e 3b30 7d0a 000a
0000107
sepang@ubuntu:~$ od -a hello.c
0000000   #   i   n   c   l   u   d   e  sp   <   s   t   d   i   o   .
0000020   h   >  nl   i   n   t  sp   m   a   i   n   (   )  nl   {  nl
0000040  ht   p   r   i   n   t   f   (   "   H   e   l   l   o  sp   W
0000060   o   r   l   d   \   n   "   )   ;  nl  ht   r   e   t   u   r
0000100   n  sp   0   ;  nl   }  nl
0000107

바이너리 파일을 8진수로 dump하는 명령어이다. option을 이용하여 다른 형식으로 출력도 가능하다('-x'는 16진수로 출력, '-a'는 아스키 코드로 출력 등). 아직 이 명령어의 필요성은 크게 느끼지 못하겠다.

ln (파일이름) (링크이름)

sepang@ubuntu:~$ ls
Desktop  Documents  hello.c  Pictures  snap       Videos
dir1     Downloads  Music    Public    Templates
sepang@ubuntu:~$ ln hello.c link_hello.c
sepang@ubuntu:~$ ls
Desktop  Documents  hello.c       Music     Public  Templates
dir1     Downloads  link_hello.c  Pictures  snap    Videos
sepang@ubuntu:~$ cat link_hello.c
#include <stdio.h>
int main()
{
	printf("Hello World\n");
	return 0;
}
sepang@ubuntu:~$ rm hello.c
sepang@ubuntu:~$ cat link_hello.c
#include <stdio.h>
int main()
{
	printf("Hello World\n");
	return 0;
}

첫번째 인자에 넣어준 파일의 링크를 생성하고 이 링크의 이름은 두번째 인자이다. 복사와는 다른데 한 파일이 두개의 이름을 가진다고 생각하면 되겠다. 때문에 둘 중 하나의 이름으로 들어가서 파일을 수정하면 다른 하나의 파일 내용을 확인해보면 동일하게 수정된 것을 확인할 수 있다. 삭제 시에는 하나를 삭제한다고 모두 링크까지 모두 삭제되지는 않는다.

tar

여러개의 파일을 전송할 때 우리는 압축을 많이 쓴다. 이는 리눅스에도 있는 기능인데 'tar'라는 명령어를 사용한다. 그런데 이 명령어의 옵션이 매우 다양하기 때문에 자주 쓰이는 것들만 살펴보자.

tar로 파일 묶기

tar -cvf (파일명.tar) (폴더명)
// ex) tar -cvf test.tar /home/sepang/dir1

tar로 파일 묶음 풀기

tar -xvf (파일명.tar)
// ex) tar -xvf test.tar

그런데 .tar 파일은 여러 파일들을 하나로 묶긴 하지만 용량이 줄어들진 않는다. 리눅스에서는 '파일을 묶는 것'과 '압축'이 세분화되어 있기 때문이다. 때문에 추가적인 옵션이 필요한데 .tar.gz 파일은 압축시 용량이 줄고 리소스 소모도 적다.

tar.gz 압축하기

tar -zcvf (파일명.tar.gz) (폴더명)
// ex) tar -zcvf test.tar /home/sepang/dir1

tar.gz 압축 풀기

tar -ㅋxvf (파일명.tar.gz)
// ex) tar -zxvf test.tar

이외에도 'gzip',' 'gunzip'명령어로 .tar파일을 압축할수도 있다.

 

참고자료

SST youtube channel / https://www.youtube.com/channel/UCora73FsjH9ZuIjCvJ0J0iA

댓글