[Linux] 리눅스 기본 명령어 - 2

728x90

디렉토리 생성

mkdir 명령어

  • -p : 디렉토리를 만들 때 상위(부모) 디렉토리가 없으면 부모 디렉토리도 함께 만든다.
  • -m : 디렉토리의 접근 권한을 설정한다.
  • -v : 디렉토리 생성시 메세지를 출력한다.
  • -z : SELinux 보안 컨텍스트 설정을 한다.
  • 리눅스에선 mkdir dir dir2 처럼 한 번에 여러개의 디렉토리를 생성할 수 있다.
  • mkdir dir/dir2 처럼 디렉토리를 생성할 때 dir 디렉토리가 없는 상태에서 dir2 를 생성할 수 없고 생성하기 위해서는 부모 디렉토리가 존재해야 한다. 하지만 mkdir -p dir/dir2 를 사용하면 부모 디렉토리와 함께 dir2 도 만들어준다.
[root@localhost ~]# mkdir kbs
[root@localhost ~]# ls -ld kbs
drwxr-xr-x. 2 root root 6  2월 14 19:34 kbs


[root@localhost ~]# ls -la kbs
합계 4
drwxr-xr-x.  2 root root    6  2월 14 19:34 .
dr-xr-x---. 17 root root 4096  2월 14 19:34 ..


[root@localhost ~]# mkdir kbs/mbc/sbs
mkdir: `kbs/mbc/sbs' 디렉토리를 만들 수 없습니다: 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# mkdir -p kbs/mbc/sbs

[root@localhost ~]# ls -ld kbs
drwxr-xr-x. 3 root root 17  2월 14 19:35 kbs

[root@localhost ~]# ls -R kbs
kbs:
mbc
kbs/mbc:
sbs
kbs/mbc/sbs:

[root@localhost ~]# touch kbs/aaa

[root@localhost ~]# ls -ld kbs
drwxr-xr-x. 3 root root 28  2월 14 19:37 kbs

[root@localhost ~]# mkdir kbs/jtbc
[root@localhost ~]# ls -ld kbs
drwxr-xr-x. 4 root root 40  2월 14 19:38 kbs

[root@localhost ~]# mkdir kbs/mbc/ebs
[root@localhost ~]# ls -ld kbs
drwxr-xr-x. 4 root root 40  2월 14 19:38 kbs

 

심볼릭 링크(소프트 링크), 하드 링크, 복사

심볼릭 링크란?

소프트 링크라고 하며, 링크를 연결하여 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크이다. 윈도우의 바로가기와 비슷한 개념이고, 특정 폴더에 링크를 걸어 원본 파일을 사용하기 위해 심볼릭 링크를 사용한다. 원본이 삭제되면 소프트 링크된 파일이나 디렉토리는 사용할 수 없게 된다.

 

하드 링크란?

원본 파일을 복사한 다음 이의 사본을 생성한다. 원본 파일을 복사한 것이기 때문에 원본과 똑같은 inode 값을 가진다. 원본으로 접근하여 파일의 내용을 수정했다면 원본과 하드 링크된 파일이 모두 수정되어 항상 같은 내용이 유지된다.

기본적으로 삭제는 파일 명을 삭제하는 것이기 때문에 inode 는 남아있고 디스크에도 해당 아이노드에 대한 데이터가 남아있다. 그래서 원본 파일을 삭제하여도 하드 링크된 폴더는 삭제되지 않는다. 자원을 공유하면서 데이터를 안전하게 관리할 때 사용하는 방법이다.

디렉토리의 데이터 블록에서 파일 명을 읽고 해당 파일 명에 대한 inode 를 확인한 후 해당 파일로 이동한다. 해당 파일의 메타 데이터를 확인한 후 디스크에서 해당하는 데이터를 읽는다.

하드 링크는 디렉토리의 어떤 파일의 inode 가 똑같은 또 다른 파일을 만드는 것이다. 파일 명은 다르더라도 inode 가 같기 때문에 똑같은 디스크에서 해당하는 데이터를 읽는다.

복사는 파일 명을 통해 inode 를 확인하고 파일의 메타 데이터를 확인해서 디스크에서 해당하는 데이터를 읽은 후 디스크의 다른 저장 장소에 복사한다. 그러면 디렉토리에 복사한 파일과 새로운 inode 가 생성되고 해당 inode 를 통해 파일의 메타 데이터를 읽고 디스크에서 데이터를 읽는다. 

inode 가 다르다는 것은 하드 디스크에 저장되는 위치가 다르다는 것이다.

하드 링크, 소프트 링크 명령어

ln -s [대상 원본 폴더 or 파일] [새로 만들 폴더 or 파일 명] ⇒ 심볼릭 링크, 디렉토리도 가능하다. 심볼릭 링크일 경우 링크 카운트는 증가하지 않는다.

ln [대상 원본 폴더 or 파일] [새로 만들 폴더 or 파일 명]→ 하드 링크 걸어주는 명령어, 링크 카운트가 증가한다. 디렉토리는 하드 링크를 걸지 못한다.

 

링크 카운트는 ., .., 디렉토리 들을 더한 값이다.

즉, mkdir -p kbs/mbc/sbs 로 kbs 내부에 mbc 디렉토리를 만들고 mbc 내부에 sbs 를 만들면

. .. mbc 로 링크카운트는 3개가 된다.

그러나 mbc 내부에 디렉토리가 생겨도 kbs 의 링크카운트는 증가하지 않는다.

kbs 내부에 디렉토리가 추가되어야 링크카운트가 증가하는 것! 파일은 디렉토리의 링크 카운트에 영향을 끼치지 않는다.

[root@localhost ~]# cp /etc/passwd aaa
cp: overwrite 'aaa'? y


[root@localhost ~]# ls -il /etc/passwd aaa
35173065 -rw-r--r--. 1 root root 2658  2월 14 07:13 /etc/passwd
67934757 -rw-r--r--. 1 root root 2658  2월 14 19:53 aaa


[root@localhost ~]# diff /etc/passwd aaa
[root@localhost ~]# sha256sum /etc/passwd
1c880794d3054d08e2026223851a08a60bb7d0adac341cf49d6a70a704b9c014  /etc/passwd


[root@localhost ~]# sha256sum aaa
1c880794d3054d08e2026223851a08a60bb7d0adac341cf49d6a70a704b9c014  aaa



[root@localhost ~]# ln aaa bbb
[root@localhost ~]# ls -il aaa bbb /etc/passwd
35173065 -rw-r--r--. 1 root root 2658  2월 14 07:13 /etc/passwd
67934757 -rw-r--r--. 2 root root 2658  2월 14 19:53 aaa
67934757 -rw-r--r--. 2 root root 2658  2월 14 19:53 bbb


[root@localhost ~]# ln aaa /tmp/bbb
[root@localhost ~]# ls -il aaa bbb /tmp/bbb
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 /tmp/bbb
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 aaa
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 bbb



[root@localhost ~]# ln -s aaa ccc
[root@localhost ~]# ls -il aaa ccc
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 aaa
67934266 lrwxrwxrwx. 1 root root    3  2월 14 20:09 ccc -> aaa


[root@localhost ~]# ln kbs ebs
ln: kbs: 디렉토리는 하드링크할 수 없습니다


[root@localhost ~]# ln -s kbs kbs2
[root@localhost ~]# ls -ild kbs kbs2
68430440 drwxr-xr-x. 5 root root 52  2월 14 19:43 kbs
68430426 lrwxrwxrwx. 1 root root  3  2월 14 20:10 kbs2 -> kbs


[root@localhost ~]# cd kbs2
[root@localhost kbs2]# pwd
/root/kbs2


[root@localhost kbs2]# ls
aaa  jtbc  mbc


[root@localhost kbs2]# cd -
/root


[root@localhost ~]# ls kbs
aaa  jtbc  mbc

cp 복사 명령어

디렉토리를 복사하기 위해서는 -r 옵션을 붙인다.

디렉토리는 데이터 블록의 내용이 증가하는 것이지 파일의 크기만큼 디렉토리의 크기가 증가하는 것이 아니다.

즉, 디렉토리의 데이터 블록에는 어떤 파일이 있고, 어떤 디렉토리가 있는지만 적혀있고, 디렉토리의 크기는 증가하는 것이 아니다.

xfs 라는 파일 시스템에선 디렉토리를 만들 때 데이터 블록에 파일을 생성해야 데이터를 사용한다. 디렉토리는 데이터 크기와 상관이 없다.

df -hTP 명령어를 입력하면 파일시스템, 타입, 사이즈 등을 확인할 수 있다.

 

[root@localhost ~]# cp aaa  eee
[root@localhost ~]# ls -il aaa eee
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 aaa
68430443 -rw-r--r--. 1 root root 2658  2월 14 20:37 eee

[root@localhost ~]# cp -r kbs mbc

[root@localhost ~]# ls -lR kbs
[root@localhost ~]# ls -lR mbc

mv 이동 명령어

파일 or 디렉토리 이동 / 이름바꾸기(같은 디렉토리에서 이동할 경우 이름 바꾸기)

mv [파일 명 or 디렉토리 명] [디렉토리] → 이동

mv [파일 명 or 디렉토리 명] [파일 명 or 디렉토리 명] → 이름 바꾸기

 

[root@localhost ~]# mv  aaa kbs/mbc/
[root@localhost ~]# ls -l aaa
ls: cannot access 'aaa': 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# ls -l kbs/mbc/aaa
-rw-r--r--. 3 root root 2658  2월 14 19:53 kbs/mbc/aaa

[root@localhost ~]# ls -ld mbc
drwxr-xr-x. 5 root root 52  2월 14 20:38 mbc

[root@localhost ~]# mv mbc /tmp
[root@localhost ~]# ls -ld mbc
ls: cannot access 'mbc': 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# ls -ld /tmp/mbc
drwxr-xr-x. 5 root root 52  2월 14 20:38 /tmp/mbc

[root@localhost ~]# ls -li kbs/mbc/aaa
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 kbs/mbc/aaa

[root@localhost ~]# mv kbs/mbc/aaa .
[root@localhost ~]# ls -li kbs/mbc/aaa
ls: cannot access 'kbs/mbc/aaa': 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# ls -il aaa
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 aaa

[root@localhost ~]# ls -lid /tmp/mbc
34268798 drwxr-xr-x. 5 root root 52  2월 14 20:38 /tmp/mbc

[root@localhost ~]# mv /tmp/mbc .
[root@localhost ~]# ls -lid /tmp/mbc
ls: cannot access '/tmp/mbc': 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# ls -lid mbc
34268798 drwxr-xr-x. 5 root root 52  2월 14 20:38 mbc

[root@localhost ~]# mv aaa jjj   <---  같은디렉토리에서 mv 는 결과적으로 이름 변경과 같다.
[root@localhost ~]# ls -il aaa
ls: cannot access 'aaa': 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# ls -il jjj
67934757 -rw-r--r--. 3 root root 2658  2월 14 19:53 jjj

삭제

삭제는 파일 평이나 폴더 명을 삭제하는 것이다. inode 는 남아있다. 파일 시스템에 따라 다르긴 하지만 보통은 파일 이름만 지운다. inode 는 남아있기 때문에 하드 디스크에는 inode 에 해당하는 데이터가 남아있다. 그래서 복구하기 위해서는 inode 를 이용해서 데이터를 읽은 후 파일 이름을 지정해주면 데이터가 복구된다.

디렉토리 자체를 삭제하면 디렉토리의 데이터 블록이 삭제되기 때문에 그 안에 존재하는 파일이나 디렉토리에 접근할 수 있는 방법이 사라진다.

디스크에서 완전히 삭제하지 않는 이유는, 복구를 해야할 필요성이 있기 때문에 완전 삭제는 하지 않는 것이다. 그 대신 삭제된 파일의 디스크 섹터는 우선순위에서 밀려서 그 섹터를 overwrite 할 수 있다.

완벽하게 지우는 방법은 null 바이트로 모든 디스크를 채워버리는 방법이 있고 물리적인 방법으로는 전자레인지에 돌리면 된다.

디렉토리 삭제 rmdir

디렉토리를 삭제하는 명령어로 삭제하기 위해서는 디렉토리 내부가 비어있어야 한다. 그래서 rmdir 은 잘쓰지 않는 명령어이다.

삭제 명령어 rm

굉장히 위험한 명령어이다.

자주 사용되는 옵션으로는 -f(강제 삭제 시에 사용), -r(하위 디렉토리 삭제 사용), -i(삭제할 것인지 물어보는 옵션) 등이 있다.

 

[root@localhost ~]# ls
anaconda-ks.cfg  ccc  eee                   jjj  kbs2  testdir1  다운로드  바탕화면  사진  음악
bbb              ddd  initial-setup-ks.cfg  kbs  mbc   공개      문서      비디오    서식

[root@localhost ~]# rm -i bbb
rm: remove 일반 파일 'bbb'? n

[root@localhost ~]# alias | grep rm
alias rm='rm -i'

[root@localhost ~]# rm bbb
rm: remove 일반 파일 'bbb'? y

[root@localhost ~]# ls -l bbb
ls: cannot access 'bbb': 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# rm -f eee
[root@localhost ~]# ls -il eee
ls: cannot access 'eee': 그런 파일이나 디렉터리가 없습니다

[root@localhost ~]# ls -il ddd
68430434 -rw-r--r--. 1 root root 0  2월 14 12:19 ddd

[root@localhost ~]# ln ddd aaa
[root@localhost ~]# ls -il ddd  aaa
68430434 -rw-r--r--. 2 root root 0  2월 14 12:19 aaa
68430434 -rw-r--r--. 2 root root 0  2월 14 12:19 ddd    <--- 링크카운트 증가

[root@localhost ~]# rm -f ddd
[root@localhost ~]# ls -il ddd  aaa
ls: cannot access 'ddd': 그런 파일이나 디렉터리가 없습니다
68430434 -rw-r--r--. 1 root root 0  2월 14 12:19 aaa     <--- 삭제 후 링크카운트 감소

하드 링크 파일 찾기

[root@localhost ~]# ln aaa bbb
[root@localhost ~]# ls -il aaa bbb
68430434 -rw-r--r--. 2 root root 2658  2월 15 00:42 aaa
68430434 -rw-r--r--. 2 root root 2658  2월 15 00:42 bbb

[root@localhost ~]# find / -inum 68430434 -ls        <--- inode를 이용해서 찾는 방법
 68430434      4 -rw-r--r--   2  root     root         2658  2월 15 00:42 /root/aaa
 68430434      4 -rw-r--r--   2  root     root         2658  2월 15 00:42 /root/bbb

[root@localhost ~]# find / -samefile  aaa  -ls  2> /dev/null       <------  samefile 옵션을 이용해서 찾는 방법
 68430434      4 -rw-r--r--   2  root     root         2658  2월 15 00:42 /root/aaa
 68430434      4 -rw-r--r--   2  root     root         2658  2월 15 00:42 /root/bbb

 

자세한 것은 find 에서 알아본다.

728x90