[Ubuntu] 2 - 파일 시스템 관리

자몽·2025년 4월 16일
0

Linux

목록 보기
2/2
post-thumbnail

리눅스 파일 시스템이 다른 운영체제와 다른 부분은,
멀티 유저 시스템이기 때문에 각 파일에 대해 개별 권한을 부여할 수 있다는 점이고,
모든 것을 파일로 취급한다는 점입니다(심지어 디렉토리도 파일로 칩니다)

디렉토리 구조

리눅스의 디렉토리 구조는 root를 중심으로, 전체 시스템을 하나의 트리 구조로 표현이 가능합니다.

ls [옵션] [파일/디렉토리 경로]

위 명령어는 디렉토리 내의 파일/폴더를 나열하는 명령입니다.
_ls_는 _list_로 부터 유래했습니다.

루트에서 위 명령어를 친다면, root에 속한 각 디렉토리들을 확인할 수 있는데요,
유래와 함께 정리하면 아래와 같습니다.

/
├── bin/       → "binary" (실행 파일)
├── boot/      → "boot" (부팅 관련 파일)
├── dev/       → "device" (장치 파일)
├── etc/       → "et cetera" (기타 설정 파일)
├── home/      → "home directory" (사용자 개인 공간)
├── lib/       → "library" (공유 라이브러리)
├── media/     → "media" (이동식 장치 마운트)
├── mnt/       → "mount" (임시 마운트 지점)
├── opt/       → "optional" (추가 소프트웨어)
├── proc/      → "process" (가상 파일 시스템)
├── root/      → "root user" (관리자 홈)
├── run/       → "runtime" (런타임 데이터)
├── sbin/      → "superuser binary" (시스템 관리자용 실행 파일)
├── srv/       → "service" (서비스 관련 데이터)
├── sys/       → "system" (가상 시스템 정보)
├── tmp/       → "temporary" (임시 파일)
├── usr/       → "Unix System Resources" (사용자용 응용 프로그램)
└── var/       → "variable" (변하는 데이터, 예: 로그)

usr이 'user'와 비슷해서, 리눅스 초기화를 위해 해당 디렉토리를 지우는 사람들도 종종 본 적이 있는데요, 'unix system resources'의 축약 형태로,
시스템의 설치된 프로그램과 라이브러리를 위한 디렉토리로 조심히 다루어야 합니다.

홈 디렉토리로 이동해 ls 명령어를 치면 지금까지 생성한 계정들이 보여집니다.

cd home
ls

파일 타입

ls 명령어에는 다양한 옵션이 있는데, 그 중 -l 옵션을 통해 상세 정보를 출력할 수 있습니다.

ls -l을 통해 아래 이미지와 같은 내용을 출력할 수 있는데요, drwxr-xr-x 와 같이 알 수 없는 형태들이 나열되어 있습니다.

이는 순서대로 아래와 같은 뜻을 가집니다.

[파일유형+권한] [링크 수] [소유자] [그룹] [크기] [수정날짜] [이름]

drwxr-xr-x에서 첫 번째로 오는 문자는 '파일 타입'을 의미합니다.

파일 유형에 어떤 값들이 들어가는지 표로 간단히 정리해 보았습니다.

유형 기호파일 종류설명
- (regular)일반 파일텍스트, 바이너리, 실행 파일 등
d (directory)디렉토리파일과 디렉토리를 포함하는 폴더
l (link)심볼릭 링크다른 파일을 가리키는 링크 파일 (윈도우의 바로가기와 유사)
c (character)문자 디바이스 파일문자 단위로 입출력하는 장치 (예: 키보드, 터미널)
b (block)블록 디바이스 파일블록 단위로 입출력하는 장치 (예: 하드디스크, USB)
s (socket)소켓 파일프로세스 간 통신을 위한 특수 파일 (IPC)
p (pipe)파이프(네임드 파이프)프로세스 간 데이터를 전달하는 통로

이를 기반으로 lib 파일은 심볼링 링크 파일, boot 파일은 디렉토리 파일이라는 것을 알 수 있습니다.

파일 권한

파일 권한 읽기

이번에는 drwxr-xr-x에서 파일 권한에 대해 분석해 보겠습니다.
파일 유형인 첫 자리를 제외하고 나머지는 3자리씩 끊어서 [소유자, 그룹, 기타] 권한 정보를 확인할 수 있습니다.

파일 유형에 대해 각 문자의 유래가 어떻게 되는지 아래 표로 정리했습니다.

문자의미유래 (영어 단어)
r읽기read
w쓰기write
x실행execute
-없음(권한 없음: no permission)

이를 통해 최종적으로 drwxr-xr-x를 분석할 수 있습니다.

  • 디렉토리 파일
  • 소유자는 rwx 이므로 읽기, 쓰기, 실행이 가능합니다.
  • 그룹은 r-x 이므로 읽기, 실행만 가능합니다.
  • 기타(사용자)는 r-x 이므로 읽기, 실행만 가능합니다.

파일 소유자, 그룹 변경

chown [옵션] [새소유자][:새그룹] 대상파일

chown은 change owner 로부터 유래했습니다.
파일의 소유자 또는 그룹을 변경하기 위해 이 명령어를 사용합니다.

테스트를 위해 root 계정으로 testuser 내부에 test 디렉토리를 만들어보겠습니다.

cd /home/testuser
mkdir test
ls -l

이러면 파일의 소유자와 그룹의 모두 root에 있다고 표시됩니다.

chown testuser test

를 통해 소유자의 권한 변경이 가능하고

chown :testuser test

를 통해 그룹 권한 변경이 가능합니다.

옵션들을 통해 변경된 항목만 출력하거나(-c), 재귀적으로 디렉토리 내부까지 권한 변경 적용(-R) 등의 작업을 추가적으로 진행할 수 있습니다.

파일 권한 변경

chmod [옵션] [권한] 파일명

를 통해 파일의 권한을 수정할 수 있습니다.
chmod는 change mode로부터 유래했습니다.

앞서 파일 권한을 읽을 때 설명했던 파일의 소유자, 그룹, 기타에 대한 권한 변경이 가능합니다.
소유자 -> u
그룹 -> g
기타 사용자 -> o
모든 사용자 -> a
를 기반으로

chmod ugo+rwx test와 같이 권한을 부여하거나, chmod ugo-rwx 와 같이 권한을 제거할 수도 있습니다.
하지만 이렇게 문자들로 권한을 수정하다보면 "소유자는 읽기만, 그룹은 모든 권한을 줘야 함" 과 같은 요구사항이 있으면 명령어를 여러 번 쳐야하는 불편함이 있습니다.

이를 해결하기 위해 8진수 방식이 생겼고, 한 번에 여러 조건을 대응할 수 있게 되었습니다.
r(read) = 4, w(write) = 2, x(excute) = 1
와 같이 변환이 가능하고, 소유자(백의 자리), 그룹(십의 자리), 기타(일의 자리)와 같이 표기가 필요합니다.

예시를 들어보겠습니다.

chmod 755 test

는 test 파일에 대해

  • 소유자는 7 -> 읽기, 쓰기, 실행 권한 부여
  • 그룹 5 -> 읽기, 실행 권한 부여
  • 기타 5 -> 읽기, 실행 권한 부여
    와 같이 권한을 부여하게 됩니다.

보통은 chmod 777 test 명령어를 통해 특정 파일에 대해 모든 권한을 부여하기도 합니다.

디렉토리 관리

작업 중인 디렉토리 확인

현재 작업 중인 디렉토리를 출력하기 위해 아래 명령어를 사용합니다.

pwd

pwd는 print working directory에서 유래됐습니다.
옵션을 통해 논리적 경로(-L), 물리적 경로(-P)를 출력할 수 있습니다.

논리적 경로는 심볼릭 링크 경로가 유지되어 그대로 보여지며, 물리적 경로는 실제 파일 시스템의 경로를 뜻합니다.

디렉토리 생성

현재 위치에 새로운 디렉토리를 생성합니다.

mkdir [옵션] 디렉토리명

만약, 이미 디렉토리가 존재한다면 File exists 에러가 발생합니다.

옵션을 통해 상위 디렉토리가 없으면 자동으로 같이 생성해주거나(-p, --parents),
생성할 디렉토리의 권한을 지정(-m, --mode)할 수도 있습니다.

디렉토리 이동

지정된 디렉토리로 이동합니다.

cd 디렉토리명

cd는 change directory에서 유래했습니다.
cd의 옵션이 존재하긴 하지만 일반 사용자에겐 거의 쓰이지 않습니다.

대신 특수 경로들을 옵션의 역할처럼 사용하는데, 구체적인 사용법은 아래 표를 참고하면 됩니다.

형태설명비고
cd홈 디렉토리로 이동cd ~ 와 같음
cd ~홈 디렉토리로 이동현재 로그인한 사용자의 홈
cd ~username다른 사용자의 홈 디렉토리 이동예: cd ~root
cd -이전 디렉토리로 이동토글처럼 이전 경로로 이동 가능
cd ..상위 디렉토리로 이동부모 디렉토리
cd .현재 디렉토리 유지주로 스크립트에서 사용
cd /경로절대 경로로 이동/로 시작하는 전체 경로
cd 상대경로상대 경로로 이동

디렉토리 제거

rmdir 디렉토리명

rmdir는 remove directory에서 유래했습니다.

디렉토리 내부에 파일이 있을 경우 해당 명령어로 디렉토리 삭제가 불가능합니다.
내부 파일과 디렉토리까지 같이 삭제하려면 보통

rm -rf 디렉토리명

과 같이 사용합니다.

명령어를 해석하면 remove recursive force directory(file)과 같습니다.
즉, '강제로 재귀적으로 디렉토리를 제거한다.' 로 번역이 가능합니다.

파일 관리

파일 생성

touch [옵션] 파일명

touch 명령어를 통해 빈 파일을 생성할 수 있습니다.

touch 명령어의 유래는 단순히 파일을 건드린다. 라는 의미해서 유래했습니다.
빈 파일 생성 명령인데 왜 네이밍이 touch인지 의문이 들 수도 있는데, 이는 옵션들을 보면 어느정도 이해가 갑니다.

touch 명령어는 옵션을 통해 단순히 생성 뿐만이 아닌 파일의 메타데이터(접근 시간, 수정 시간)의 수정도 가능합니다.
-a옵션은 접근 시간만 갱신하고, -m은 수정 시간만 갱신합니다.

파일 복사

cp [옵션] <원본..> <대상>

cp 명령어는 copy에서 유래되었으며, 파일이나 디렉토리를 복사할 때 사용합니다.

디렉토리 내부에 있는 모든 파일을 복사하기 위해서는 -r옵션을 통해 디렉토리 내부를 재귀적으로 탐색하며 파일을 복사하고, -p옵션을 통해 파일 복사 시 권한/시간을 유지합니다.

조금 독특한 점은 한 번에 여러 파일들을 복사할 수 있다는건데요,
예를 들어 cp file1.txt file2.txt /home/test 명령은 file1과 file2를 /home/test 디렉토리로 복사하라는 뜻을 가집니다.

파일 이동

mv [옵션] <원본..> <대상>

mv 명령어는 cp 명령어와 사용법이 유사하며, move에서 유래되었으며 파일을 이동하는데 사용됩니다.

파일 삭제

앞서서도 언급했지만 rm 명령어를 통해 파일 삭제가 가능합니다.

rm [옵션] 파일명

파일 검색

find [탐색경로] [옵션] [표현식] [동작]

파일은 find 명령어을 통해 검색합니다.

find 명령어는 다양한 옵션을 가지고 있는데요, 이를 간단히 표로 정리하면 아래와 같습니다.

옵션설명
-name "<패턴>"파일 이름이 패턴과 일치 (와일드카드 사용 가능)
-iname "<패턴>"대소문자 구분 없이 이름 검색
-type f일반 파일만 검색
-type d디렉터리만 검색
-size +100M크기 조건 (100MB 초과)
-mtime -7최근 7일 이내 수정된 파일
-empty비어있는 파일 또는 디렉터리
-user <사용자>해당 사용자가 소유한 파일

보통은 find -iname file1.txt와 같이 name/iname 옵션을 가장 많이 사용합니다.

find 명령어에서 특이한 점은 '동작' 개념을 가지고 있다는 것인데요,
아래 표와 같이 기본 값인 print 동작 말고도 삭제, 실행과 같은 동작을 할 수 있습니다.

동작설명
-print기본 동작, 찾은 파일의 경로를 출력
-delete찾은 파일 또는 디렉터리를 삭제
-exec <명령어> {} \;각 파일에 대해 명령어 실행 ({} 자리에 파일명이 들어감)
-exec <명령어> {} +여러 파일을 한 번에 명령어에 넘김 (xargs처럼 성능 ↑)

실제로 /tmp 디렉토리에 아래와 같이 test.py 파일을 만들고

이를 exec 로 실행시킬 수 있습니다.

find . -name "test.py" -exec python3 {} \;

만약 여러 개의 파일을 실행시키거나 삭제, 특정 명령을 실행시키고 싶다면
find . -name "*.py" -exec python3 {} \; 를 통해 여러 파이썬 파일들을 동작시킬 수 있습니다.

파일 내용 검색

grep [옵션] [정규식] 파일명

grep은 Global Regular Expression Print의 줄임말로, '전체에서 정규표현식이 매칭되는 줄을 출력하라.' 라는 의미입니다.

grep newly adduser.conf는 adduser.conf 파일에서 newly 단어를 찾아서 매칭되는 줄을 출력해줍니다.

grep에는 다양한 옵션이 있는데, 이를 간단하게 표로 정리해 보겠습니다.

옵션설명
-i대소문자 구분 없이 검색
-r 또는 -R하위 디렉터리까지 재귀적으로 검색
-n매칭된 라인의 줄 번호 출력
-v패턴과 일치하지 않는 라인 출력 (부정 검색)
-l일치하는 라인이 있는 파일 이름만 출력
-c일치하는 라인의 개수만 출력
-H파일 이름과 함께 결과 출력 (기본값이나, 명시적으로 사용 가능)
--color검색된 키워드에 색상을 입혀서 보기 좋게 출력

파일 여러개가 있고, 여기서 특정 단어를 찾고 싶을 때 grep을 사용하면 원하는 결과를 얻을 수 있습니다.

만약 'todo'라는 단어가 있는 파일과 라인을 모두 찾고 싶다면 아래 명령어를 통해 모두 검색이 가능합니다.

grep -ir 'todo'

마치며

다음 글에서는 리눅스의 프로세스와 네트워크에 대해 다뤄보려 합니다.

profile
자몽의 기술 블로그. 꾸준하게 공부하기

0개의 댓글