[Linux] 파일과 디렉터리

강주형·2023년 2월 14일
0

리눅스 입문

목록 보기
2/3

이론

파일과 디렉터리의 구조

파일 특징

  • 파일은 모두 경로와 이름이 있음
  • 다른 경로에는 같은 이름에 파일이 있을 수 있음
  • 경로와 이름이 모두 같을 수는 없음
  • 하나의 파일에는 데이터가 들어가 있음
  • 파일은 데이터를 담는 그릇이라고 보면 됨

변수와 파일의 차이

  • 변수는 메모리에 존재
  • 파일은 디스크에 존재
  • 일시적으로 메모리에 올려놓고 작업을 할 때는 데이터를 변수에 담아서 사용
  • 영구적으로 저장해서 사용할 때는 데이터를 파일에 담아서 사용

<참고>
영구적: 전원이 없어도 지워지지 않는다.

파일 시스템

  • 파일이 잘 동작하기 위한 환경을 제공
  • 파일을 관리하기 위한 시스템
  • 운영체제의 일부
  • 운영체제와 디스크 사이에 있음

리눅스는 트리 형태의 계층 구조를 가지고 있음

  • 윈도우도 계층 구조를 가지고 있지만 구성하는 방식이 다름
  • 리눅스는 root에서 모든 게 뻗어나가는데, 윈도우는 각 디스크 드라이브로 나누어짐
  • 리눅스에 새로운 HDD/SSD를 추가하면 root 아래에 비어있는 디렉터리를 만들고 새로운 HDD/SSD의 내용을 마운트하는 방식

파일의 종류

  • 일반 파일: 텍스트, 동영상 파일 등
  • 디렉터리: 디렉터리도 파일의 한 종류 (윈도우에서의 폴더)
  • 심볼릭 링크 파일: 어떤 다른 파일을 가리키는 파일 (윈도우에서의 바로가기)
  • 블록 디바이스 파일: 블록 디바이스를 제어하기 위한 파일 (일반 사용자는 사용 안 함)
  • 문자 디바이스 파일: 문자 디바이스를 제어하기 위한 파일 (일반 사용자는 사용 안 함)
  • 파이프 파일: 파이프를 나타내는 파일, 프로세스간 통신에 사용 (일반 사용자는 사용 안 함)
  • 소켓: 소켓을 나타내는 파일, 프로세스간 통신에 사용 (일반 사용자는 사용 안 함)

생소한 파일 종류들은 다시 나올 때 다시 보기


디렉터리 개념과 대표적인 디렉터리

디렉터리

  • 현재 작업 디렉터리(CWD: Current Working Directory)
    -> 확인하고 싶으면 $ pwd

  • 홈 디렉터리(home directory)
    -> 예: /home/joohyeong/

  • 상대 경로: 쉘이 지금 어디에서 실행하고 있는지(현재 작업 디렉터리가 어디인지)에 따라 달라짐
    -> 예: ../cde
    -> ..: 부모 디렉터리
    -> .: 현재 디렉터리

  • 절대 경로: 현재 디렉터리에 상관 없이 절대적인 경로
    -> 예: /xyz/abc


디렉터리설명
/루트 디렉터리, 모든 디렉터리의 최상위 부모
/bin모든 사용자가 사용할 수 있는 여러가지 실행 파일 위치
사용자에 따라 /usr/bin 위치 가능
/sbin시스템 관리자 권한으로 실행해야 하는 여러가지 실행 파일 위치
사용자에 따라 /usr/sbin 위치 가능
/etc여러 가지 설정 파일이 들어가며 주의가 필요
sudo 명렁을 이용하면 수정 가능
/lib공유 라이브러리 디렉터리
사용자에 따라 /usr/lib 위치 가능
/home사용자들의 홈 디렉터리
/mnt일시적으로 파일 시스템에 마운트하는 경우 사용
/proc
/sys
시스템 정보를 설정/조회할 수 있는 채널을 만들어 주는 디렉터리
리눅스 개발자는 만질 일이 좀 있음
/tmp임시 디렉터리
/usr사용자가 추가한 실행 파일, 라이브러리 등의 소프트웨어 저장
/dev디바이스 드라이버가 사용하는 디바이스 파일 디렉터리

아이노드, 하드링크, 소프트링크

아이노드(inode): 하나의 파일의 메타데이터들이 저장되어 있는 공간

  • 파일 이름은 아이노드에 포함 안 됨
  • 이름 - 아이노드 - 파일데이터 이렇게 연결되어 있음

소프트링크(=심볼릭링크, =심링크)

  • 윈도우에서 어떤 실행파일의 바로가기 실행하면 원 파일을 실행한 것과 동일하게 동작하는데, 이게 리눅스의 소프트링크와 유사함
  • 같은 디렉터리에 있을 필요 없음
  • 소프트링크 파일도 이름 - 아이노드 - 파일데이터로 구성됨
  • 아이노드와 파일데이터는 원본 파일과 다른 것임
  • 소프트링크 파일의 파일 데이터에는 원본 파일의 경로가 저장되어 있음

하드링크

  • 대상이 되는 아이노드를 하드링크가 공유함
  • 사용 횟수가 많지 않음, 특수한 목적으로 사용

https://miro.medium.com/max/628/1*ojVZedoItdtM1OEpl9YatQ.png

이미지로 쉽게 이해하기


실습

파일 다루기

$ ls -al

  • -a: .으로 시작하는 (숨기고 싶은) 파일도 모두 출력
  • -l: 좀 더 많은 정보를 출력

빈 파일 만들기

$ touch filename

파일 삭제

$ rm filename

윈도우에서는 파일을 삭제하면 휴지통으로 이동하지만, 리눅스에서 rm 명령어를 하면 완전 삭제해버림

$ mv는 파일의 파일명(혹은 디렉터리)를 변경함
-> 파일명은 사실 디렉터리까지 내포하고 있음

예시

  1. 현재 디렉터리의 test라는 파일의 파일명을 apple로 변경하기
$ mv test apple
  1. 현재 디렉터리의 test라는 파일을 /tmp/로 이동하고, 파일명은 apple로 변경하기
$ mv test /tmp/apple
  1. 현재 디렉터리의 test라는 파일을 /tmp/로 이동하고, 파일명은 그대로 유지하기
$ mv test /tmp/

부모 디렉터리 .., 현재 디렉터리 .을 사용하여 상대 경로를 활용할 수도 있음!

현재 디렉터리가 /dir1/dir2이고, apple 이라는 파일이 있을 때, 이 파일을 /dir1/dir3로 이동하고 파일명은 pineapple로 변경하기

$ mv apple ../dir3/pineapple

디렉터리 다루기

$ rmdir: 디렉터리 삭제, 삭제하려는 디렉터리 내에 파일이 존재하면 삭제가 불가능함

$ rm -r: 디렉터리를 삭제하고, 그 안에 있는 파일까지 모두 삭제하기
$ rm -f: 경고 없이 강제로 삭제하기

일반적으로 $ rm -rf로 많이 사용 (주의해서 사용하기)

디렉터리명 변경도 $ mv 쓰면 됨


아이노드와 하드링크

$ ls -i를 하면 각 파일의 아이노드 번호까지 출력이 가능함

$ ln: 하드링크 만들기

pinapple 파일에 대한 하드링크로 hello를 만들어보자

$ ls -ali를 해보면 다음과 같이 나옴
두 파일의 아이노드 번호가 같은 것을 볼 수 있음!

두 파일을 모두 출력해보자
모두 같은 내용이 들어가있는 것을 확인

hello 파일의 내용을 nano 에디터로 수정한 후에 다시 확인해보자
두 파일 모두 수정이 됨!
하드링크의 개념과 연결해서 생각해보기

<참고>
$ stat filename: 파일 속성 조회, 아이노드 번호와 하드링크 개수 확인 가능


소프트 링크

소프트링크(심링크)를 만들 때는 $ ln -s를 사용하면 됨
하드링크 만들 때에서 -s만 추가해주면 되는 것
이렇게 표시가 됨

파일 내용을 출력해보면 하드링크처럼 동일하게 나옴

원본 파일인 pineapple을 수정하고 다시 출력하면 둘다 수정되어서 나옴

만약에 원본 파일인 pineapple을 제거하고 $ ls를 보면 이렇게 빨갛게 나옴

여기서 hello(심링크 파일)를 출력해보면 없는 파일로 나옴

이 상태에서 pineapple을 다시 생성하고 출력하면 다시 연결이 되는 것을 볼 수 있음

<참고>

  • 하드링크 파일은 디렉터리를 바꿔도 다 출력 됨
  • 만약에 hello(심링크 파일)를 다른 디렉터리로 옮기면 제대로 출력되지 않음
    -> 왜냐하면, 해당 심링크는 현재 디렉터리에 있는 pineapple이라는 파일을 연결하는 건데, 바뀐 디렉터리에는 해당 파일이 없어서 그런 것
    -> 만약에 옮긴 디렉터리에 새로운 pineapple이라는 파일을 만들면 그 파일에 새로 연결이 됨
  • 심링크는 절대경로/상대경로 모두 지정할 수 있음

파일명을 따로 지정하지 않고 경로만 넣으면 동일한 파일명으로 생성하고 연결함
아래 예시 참고

위처럼 절대경로로 지정했으면 심링크 파일을 이동해도 계속 연결되어 있음

상대경로로 지정도 가능한 것 참고!

profile
Statistics & Data Science

0개의 댓글