[리눅스마스터 1급] 이기적 이론서 5회차 정리 - 파일 시스템 관리
🏁 이기적 이론서 학습 범위
- PART 01 리눅스 시스템 관리
- CHAPTER 01 일반 운영 관리 (SECTION 02 파일 시스템 관리)
파일 시스템 관리
☑️ 파일 및 디렉터리 관리
소유권과 허가권
- 소유권과 허가권 확인하기
ls - l
,ls -n
$ ls -l loop.sh -rw-r--r-- 1 francis francis 68 Sep 2 21:22 loop.sh - rw -r-- r-- 1 francis francis 68 Sep 2 21:22 loop.sh 1 2 3 4 4
- 파일유형: 일반 파일(1,
-
), 디렉터리(d
) 등을 표시한다. - 허가권: 소유자 허가권(2,
rw-
), 그룹 허가권(3,r—
), 다른 사용자 허가권(4,r—
)으로 구분하여 설정한다.- 읽기, 쓰기, 실행 가능한 지 세분화하여 권한을 설정할 수 있다.
- 소유권: 사용자 소유권(4,
r—
), 그룹 소유권을 표시
- 파일유형: 일반 파일(1,
파일 유형
파일 유형 설명 - 일반 파일 d 디렉터리 l 심볼릭 링크 b 블록 디바이스 c 캐릭터 디바이스 p FIFO s 소켓 허가권
허가권 설명 소유자 허가권 파일이나 디렉터리를 소유한 사용자의 허가권 그룹 허가권 파일이나 디렉터리를 소유한 그룹의 허가권 (그룹에 속한 사용자에 대한 허가권) 다른 사용자 허가권 소유자나 그룹에 속하지 않은 사용자의 허가권 읽기, 쓰기, 실행 권한 부여
허가권 파일 디렉터리 읽기 권한(r) 파일 내용을 확인 및 복사 디렉터리 내 포함된 파일과 디렉터리 확인 쓰기 권한(w) 파일 내용 수정 디렉터리 내 파일 등을 수정, 생성, 삭제 실행 권한(x) 실행 가능한 파일을 실행 디렉터리 안으로 접근 가능.
소유권
소유권 설명 사용자 소유권 파일이나 디렉터리 소유자 그룹 소유권 파일이나 디렉터리를 소유한 그룹에 속한 사용자의 소유권 - 허가권 변경하기
chmod
: 기호나 8진수 숫자를 통해 허가권 변경- 기호(symboloic)
- 읽기(r), 쓰기(w), 실행(x)
- 권한 추가(
+
), 삭제(-
), 지정(=
) - 사용자 허가권(
u
), 그룹 허가권(g
), 다른 사용자 허가권(o
), 모든 사용자(a
)
- 8진수 숫자(octal number)
- 읽기(
4
), 쓰기(2
), 실행(1
), 권한 부여 X(0
) - 조합으로 표현 가능 (ex. 읽기 및 쓰기 권한 →
4 + 2 = 6
) - 8진수 중 4번째 자리는 특수권한, 3번째 자리는 사용자 허가권, 2번째 자리는 그룹 허가권, 1번째 자리는 다른 사용자 허가권 (ex.
755
→ 사용자 허가권은 모든 허가권을 갖고, 그룹과 다른 사용자 허가권은 읽기, 실행 권한만 가짐)
- 읽기(
형식
chomod [option] mode file(s)
옵션
옵션 의미 -R, —recursive 특정 디렉터리 내의 파일과 디렉터리에 대해 재귀적으로 허가권 변경 -C, —changes 변경된 파일이나 디렉터리에 대한 자세한 정보 출력 -t, —silent, —quite 대부분의 에러 메시지 출력 제한 —reference 모드 대신 파일에 지정한 모드 사용 예제
# myfile.txt의 사용자는 읽기, 쓰기 권한을 부여하고, 그룹과 다른 사용자는 읽기 권한만 부여 $ chmod 644 myfile.txt # myfiles 디렉터리 이하 모든 파일과 디렉터리에 대해 사용자는 모든 권한을 부여하고, 그룹과 다른 그룹 사용자는 읽기 및 실행 권한만 부여 $ chmod -R 755 myfiles # myfile.txt에 대해 사용자에게 읽기 및 쓰기 권한 부여 $ chmod u=rw myfile.txt # myscript.sh에 대해 사용자느 모든 권한을 부여하고 그룹과 다른 사용자는 읽기 및 실행 권한 부여 $ chmod 755 myscript.sh # file.txt에 대해 모두에게 읽기, 쓰기 권한 부여 $ chmod a=rw file.txt
- 사용자 및 그룹 소유권 변경하기
chown
: 오직 루트사용자만 파일이나 디렉터리의 사용자 및 그룹의 소유권 변경 가능chown [options] owner[:group] file(s)
- 사용자 및 그룹 소유권은 이름, UID, GID를 의미하는 숫자로 지정 가능하다.
예제
$ sudo chown myuser myfile.txt # myfile.txt의 사용자 소유자를 myuser로 변경 $ sudo chown myuser myfile1.txt myfile2.txt myfile3.txt # 세 파일의 소유자를 myuser로 변경 # myfile.txt에 대해 사용자는 myuser, 그룹은 mygroup으로 소유자 변경 $ sudo chown myuser:mygroup myfile.txt # myfiles 디렉터리 이하의 모든 파일 및 디렉터리에 대해 사용자는 myuser, 그룹은 mygroup으로 소유자 변경 $ sudo chown -R myuser:mygroup myfiles $ sudo chown :mygroup myfile.txt # myfile.txt에 대해 그룹 소유자만 mygroup으로 변경 # myfile.txt에 대해 사용자 UID가 2000으로 변경, 그룹 GID는 2001로 변경 $ sudo chown 2000:2001 myfile.txt
- 그룹 소유권만 변경하기
chgrp
: 본인이 소유한 파일에 대해 본인이 속한 그룹 내에서 소유권 변경 가능chgrp [options] roup file(s)
예제
$ chgrp colors blue.txt # blue.txt에 대해 그룹을 colors로 변경 # color_files 디렉터리 이하 모든 파일과 디렉터리에 대해 그룹을 colors로 변경 $ chgrp -R colors color_files
- 기본 허가권 변경하기
umask
**: 파일이나 디렉터리 생성 시 기본 허가권을 지정umask [option] [mask]
- 기본 허가권 값은 파일은 666(rw-rw-rw-), 디렉터리는 777(rwxrwxrwx)
- ex.
022
→ 파일 생성 시 644(rw-r-r—), 디렉터리는 755(rwxr-xr-x)
- ex.
옵션
옵션 의미 -S umask 값을 숫자 대신 문자로 표기 예제
$ umask # 시스템상의 현재 umask값 확인 $ umask -S # 문자로 확인 $ umask u=rwx,g=rw,o=rx # 문자를 사용하여 umask 설정
특수 권한
- Set-UID 권한 비트 (Set User ID bit)
- 파일에 Set-UID 비트 설정 시 사용자가 파일을 실행했을 때 파일의 소유자 권한으로 실행된다.
- 소유자 허가권(g)에 ‘s’를 추가하거나 문자, 숫자 방식으로 설정할 수 있다.
예시
# 실행 권한이 없는 파일에 Set-UID 비트 설정 시 'S'로 표기 $ ls -l select.sh -rwSrw-r--. 1 francis francis 80 Sep 1 00:22 select.sh # Set-UID 비트 설정 $ chmod u+s hello.sh # 소유권 허가권(g)에 's'를 추가 $ chmod u=srwx.g=r.o=r hello.sh # 문자 방식으로 설정 $ chmod 4744 hello.sh # 숫자 방식으로 설정 시 가장 앞에 '4'를 붙여준다.
- Set-GID 권한 비트 (Set Group ID bit)
- 파일에 Set-GID를 지정하면 해당 파일의 그룹으로 실행된다.
- 디렉터리에 Set-GID를 지정하면 하나의 디렉터리를 여러 사용자가 공동작업할 수 있다.
- 그룹 허가권(g)에
‘s’
를 추가하거나 문자 또는 숫자 방식으로 설정할 수 있다. - 실행 권한이 없는 파일이나 디렉터리에 Set-GID 설정 시
‘S’
로 표기된다. 예시
$ chmod g+s hello.sh # 그룹허가권(g)에 's'를 추가 $ chmod u=rwx.g=sr.o=r hello.sh # 문자 방식으로 설정 $ chmod 2744 hello.sh # 숫자 방식으로 설정 시 가장 앞에 '2'를 붙여준다.
- 스티키 비트(sticky bit)
- 디렉터리에만 적용 가능하다.
- 스티키 비트를 디렉터리에 지정 시 누구나 그 안에 디렉터리나 파일을 생성할 수 있지만, 삭제는 오직 그 파일을 소유한 사용자만 가능하다.
- 문자 방식인 경우
't'
를 사용하여 스티키 비트를 추가하고, 숫자 방식인 경우'1'
을 사용하여 스티키 비트 추가한다. 예시
# 스티키 비트의 대표적 예시인 /tmp 폴더 # 모두에게 모든 권한이 있지만 스티키 비트 't'가 설정되어 있다. $ ls -ld /tmp/ drwxrwxrwt. 19 root root 4096 Oct 22 23:!4 /tmp/ $ chmod o+t dir1 # 't'를 사용하여 스티키 비트를 추가 $ chmod 1777 dir1 # '1'을 사용하여 스티키 비트 추가
파일 링크 (File link)
- 파일 링크
- 리눅스에는 이미 존재하는 파일에 대한 포인터를 갖는 파일 링크 기능을 제공한다.
- 파일링크에는 하드 링크(Hard link)와 심볼릭 링크(Symbolic link)가 있다.
- 하드 링크(Hard Link)
- 동일 파일 시스템 내에서만 하드 링크를 생성할 수 있다.
- 디렉터리를 링크할 수 있다.
- 대상 파일과 동일한 아이노드 번호와 허가권을 가진다.
- 대상 파일의 허가권 변경 시, 하드 링크의 허가권도 변경된다.
- 대상 파일과 동일한 아이노드를 갖기 때문에 대상 파일을 옮기거나 삭제하더라도 대상 파일을 참조 가능하다.
ln
로 하드 링크를 생성한다.$ ln source.file hardlink.file $ ls -lia *.file # ls -lia 를 사용하여 대상 파일과 하드링크의 아이노드 값을 확인한다.
- 심볼릭 링크(Symbolic link)
- 심볼릭 링크 생성 시 원본 파일과 대상 파일이 서로 다른 파일 시스템에 위치해도 된다.
- 디렉터리에 대한 심볼릭 링크를 생성할 수 있다.
- 심볼릭 링크와 대상 파일은 아이노드 번호와 파일 허가권이 다르다.
- 대상 파일의 아이노드가 아닌 대상파일의 경로만 참조한다.
ln -s
로 심볼릭 링크를 생성한다.
디렉터리 관리
- pwd
- 현재 파일 시스템상 어떤 디렉터리에 있는 지 출력한다.
type
: 현재 사용하고 있는 pwd가 무엇인지 출력한다.$ type pwd $ type /bin/pwd
현재 작업 디렉터리를 확인하려면 옵션 없이 사용한다.
$ pwd
- cd
- 작업 디렉터리를 변경한다.
/
: 루트 디렉터리로 절대 경로라고 부른다.- 절대 경로를 통해 디렉터리 변경이 가능하다.
$ cd /home/francis/Documents
/
로 시작하지 않으면 현재 디렉터리를 기점으로 경로를 생성한다. (상대경로)- 상대 경로를 통해 디렉터리 변경이 가능하다.
$ cd francis/Documents
..
: 부모 디렉터리$ cd ..
.
: 현재 디렉터리- 명령을 수행해도 현재 디렉터리에서 현재 디렉터리로의 이동이므로 변화가 없다.
$ cd .
-
: 이전 디렉터리$ cd -
- mkdir
- 파일 시스템상 디렉터리를 생성하는 명령어
형식
mkdir [option] directory
옵션
옵션 설명 -m, —mode 디렉터리 생성 시 설정할 허가권을 지정한다. -p, —parents 디렉터리 생성 시 상위 디렉터리도 필요하다면 생성한다. 예제
$ mkdir photos # photos 디렉터리 생성 $ mkdir photos ./albums/photos # albums 디렉터리가 존재하지 않으면 photos 디렉터리와 함께 생성 # photos 디렉터리 생성 시 파일 허가권을 777로 지정 $ mkdir -m 777 photos OR $ mkdir -m u=rwx.g=rwx.o=rwx photos
- rmdir
- 파일 시스템상 비어있는 디렉터리를 삭제한다.
- 비어있지 않다면 삭제되지 않고, 디렉터리 내의 다른 빈 디렉터리만 삭제된다.
- 비어있지 않은 디렉터리를 삭제하려면
rm -r
을 사용한다. 형식
mkdir [option] directory ...
옵션
옵션 설명 -p - 지정 경로 중 가장 아래 디렉터리부터 상위로 거슬러 올라가며 삭제한다.
- 디렉터리가 비어있으면 삭제하고 비어있지 않으면 삭제하지 않고 멈춘다.예제
$ rmdir mydir1 # mydir1 디렉터리 삭제 $ rmdir mydir1 mydir2 # mydir1, mydir2 둘 다 삭제 $ rmdir -p mydir1/mydir2/mydir3 # 3->2->1 순서대로 디렉터리 제거
파일 관리
- ls
- 지정한 경로에 존재하는 파일과 디렉터리 리스트를 출력한다.
- 파일의 크기, 소유자, 수정 시간 등 다양한 정보도 함께 보여준다.
- 옵션 없이 사용하면 현재 디렉터리에 존재하는 파일 및 디렉터리를 알파벳 순으로 리스트를 출력한다.
형식
ls [option] file ...
예시
$ ls -l # 현재 경로의 파일과 디렉터리 모두 출력 # 숨겨진 파일을 포함한 모든 파일 출력, 파일 유형을 뜻하는 문자를 붙여준다. # 파일 유형인 경우 '*', 디렉터리인 경우'/'로 표시 $ ls -alF $ ls -ld Videos # Videos 디렉터리 자체 정보(내부 파일과 항목)를 보여준다. $ ls -ldi Videos # -i 옵션 사용 시 Videos의 아이노드 번호를 추가로 출력한다.
- cp
- 지정한 파일이나 디렉터리를 복사한다.
- 파일 복사가 성공한 경우 아무 출력이 없고, 출력 결과는
-v
**를 사용해 확인한다. - 파일이 이미 존재하는 경우 복사 시 기본적으로 덮어쓰기가 된다.
- 덮어쓰기를 원하지 않으면
-i
를 사용한다.
- 덮어쓰기를 원하지 않으면
형식
cp [option] source ... destination
예제
# 현재 작업 경로의 resume.doc를 같은 경로에 myresume.doc로 복사 # 동일 파일이 존재하면 사용자 확인 없이 덮어쓴다. $ cp resume.doc myresume.doc $ cp ~/resume.doc /tmp # 홈 디렉터리의 resume.doc를 /tmp 경로로 복사 # 홈 디렉터리의 Documents 디렉터리의 모든 docx 파일과 scores.xls, readme.txt를 홈 디렉터리의 SendTo 경로로 복사 $ cp ~Documents/*.docx ~/Documents/scores.xls ~/DOcuments/readme.txt ~/SendTo # 홈 디렉터리의 Documents의 모든 파일, 디렉터리, 하위 디렉터리까지 모두 복사 $ cd -R ~/Documents ~/DocumentsBackup # library-10.so에 대한 심볼릭 링크를 library.so 파일명으로 생성 $ cp -s library-10.so library.so # /home/francis의 모든 파일과 디렉터리의 모든 속성을 유지하면서 /backup 디렉터리에 복사 $ cp -a /home/francis/* /backup/
- rm
- 지정한 파일을 삭제한다.
-r
,-R
명령어 사용시 디렉터리를 삭제한다.- 옵션을 사용하지 않으면 디렉터리를 지우지 않는다.
- 파일 시스템상에서 파일 이름과 실제 데이터와의 링크를 제거하며, 데이터 자체를 지우지 않는다.
형식
rm [option] file ...
옵션
옵션 설명 -i 삭제 전 사용자의 확인을 받는다. -f, —force 파일이 존재하지 않더라도 무시한다. -r, -R, —recursive 디렉터리와 그 이하의 파일 및 디렉터리를 모두 삭제한다. 예제
# 파일에 '-'를 포함하면 파일 이름이 아닌 옵션으로 잘못 해석할 수 있다. $ rm -- -dashfile.txt # -- 를 파일 이름 전에 기입하여 삭제 OR $ rm ./-dashfile.txt # '.'을 통해 경로를 지정하거나 절대경로를 사용하여 삭제한다. $ rm photo.jpg # photo.jpg를 삭제한다. $ rm -f photo.jpg # photo.jpg가 쓰기 보호된 상태여도 사용자 알림 없이 삭제한다. $ rm -i * # 현재 경로의 모든 파일을 삭제 시도하며, 사용자 확인을 받는다. # 홈 디렉터리의 photos 디렉터리의 모든 파일 및 디렉터리, 디렉터리의 모든 내용까지 삭제한다. 쓰기 보호 파일이 있어도 사용자에게 묻지 않고 모두 삭제한다. $ rm -rf ~/photos
- shred
rm
은 파일 시스템상 실제 데이터를 지우지는 않는다.- 데이터까지 지우고 싶으면
shred
를 사용한다. - 추후 데이터를 재생할 수 없도록 다른 데이터로 덮어쓴다.
$ shred -u file.txt # file.txt를 삭제 후, 데이터를 여러 번 덮음
- mv
- 지정한 파일이나 디렉터리를 지정한 경로로 이동하거나 이름을 변경한다.
형식
mv [option] source ... destination
옵션
옵션 설명 -i, —interactive 파일의 허가권과 관계없이 존재하는 파일을 덮어쓰기 전에 사용자에게 확인을 받는다. -f, —force 사용자 확인 없이 해당 파일이 이미 존재해도 덮었느다. -b 대상 파일이 이미 존재하는 경우 덮어쓰기 전에 백업파일을 만든다. 백업파일의 파일명은 원본 파일명 뒤에 ‘~’가 붙는다. -u, —update 대상 파일이 최신인 경우 덮어쓰지 않는다. -t, —target-directory 모든 원본 파일을 지정한 경로로 이동한다. 예제
# musicbox가 디렉터리라면 music.mp3를 musicbox 안에 복사하고, 파일이라면 music.mp3를 musicbox로 이름을 변경하여 덮었느다. 존재하지 않는 파일이면 이름을 변경한다. $ mv music.mp3 musicbox # 지정한 3개의 파일을 musicbox 디렉토리로 이동한다. $ mv music.mp3 spring.mp3 fall.mp3 musicbox # -t를 사용해 이동할 대상 디렉터리를 지정한다. # 3개의 파일을 musicbox 디렉터리로 이동한다. $ mv -t musicbox music.mp3 spring.mp3 fall.mp3 # 현재 경로의 musicbox 디렉터리를 musics 디렉터리로 이름을 변경한다. $ mv musicbox/ musics/
- touch
- 파일의 마지막 접근 시간(access time), 수정 시간(modification time), 변경 시간(change time)과 같은 파일스탬프 정보를 수정한다.
- 파일이 없으면 빈 파일을 생성한다.
형식
touch [option] filename
옵션
옵션 설명 -a atime만 변경한다. -m mtime만 변경한다. -t - 현재 시간 대신 지정한 타임스태프를 설정한다.
- 타임스태프 형식은 [[CC]YY]MMDDhhmm[.ss]이다.
- 타임스태프를 미래나 과거로 변경하려면 쓰기 권한이 필요하고, 파일 소유자여야 한다.-r, —reference - 현재 시간이 아닌 지정한 파일의 타임스태프로 변경한다.
- 옵션으로 지정한 파일에 대한 쓰기 권한 및 소유자여야 한다.-c, —no-create 파일을 생성하지 않는다. 예제
# 파일이 존재하면 atime, mtime, ctime을 현재 시스템 시간으로 변경한다. # 파일이 존재하지 않으면 빈 파일을 생성한다. $ touch file.txt # 파일이 존재하는 경우 파일스탬프를 현재 시스템 시간으로 변경한다. # 존재하지 않으면 빈 파일을 생성하지 않는다. $ touch -c file.txt # file.txt의 atime만 변경한다. $ touch -a file.txt # file1.txt의 atime 및 mtime으로 file2.txt의 타임스태프 정보를 변경한다. $ touch -r file1.txt file2.txt # file.txt의 mtime을 2021.10.25 17:00으로 변경한다. $ touch -m -t 2021101251700 file.txt
리눅스에서 관리하는 타임스탬프
유형 설명 축약어 접근시간 파일을 읽은 마지막 시간 atime 수정시간 파일의 내용이 변경되었던 마지막 시간 mtime 변경시간 - 파일 허가권과 같은 상태가 변경되었던 시간
- atime과 mtime도 파일의 상태가 포함되므로 이들이 변경되면 ctime도 변경됨ctime
- file
- 파일 유형을 확인한다.
형식
file [option] filename
옵션
옵션 설명 -b, —brief 파일명은 출력하지 않고 파일 유형만 출력한다. 예제
$ file a.txt $ file -b a.txt # -b 옵션을 사용하면 파일명이 나오지 안흔ㄴ다.
- find
- 파일이나 디렉터리 이름, 생성날짜, 수정날짜, 소유자, 허가권 등 사용자가 지정한 조건에 부합하는 파일 시스템에 존재하는 파일과 디렉터리를 찾는다.
- 옵션은 너무 많아 생략..
예제
# 옵션을 사용하지 않거나, 현재경로 '.'를 지정하면 현재 경로의 파일 및 디렉터리, 이하의 모든 파일과 디렉터리를 출력 $ find # 현재경로와 /home/francis, /home/chris의 모든 파일과 디렉터리 이하의 모든 내용을 출력 $ find ./home/francis /home/chris # 현재 경로에서 확장자가 zip인 모든 파일을 찾는다. # -iname 사용 시 대소문자를 구분하지 않는다. $ find . -name '*.zip' # 파일 유형이 파일이고, 파일 이름이 'apple'인 파일을 찾는다. $ find . -name 'apple' -type f # 그룹이 데몬이 파일과 디렉터리를 현재 경로에서 찾는다. $ find . -group daemon # 사용자 소유권이 francis인 파일을 찾는다. $ find . -user francis # 파일 접근 시간이 5일 이상된 파일과 디렉터리를 찾는다. # -5로 설정한다면 5일 이내의 파일과 디렉터리를 찾는다. $ find . -atime +5 # 현재 경로에서 허가권이 rwxr-xr--인 파일을 찾는다. $ find . -perm u=rwx.g=rx.o=r OR $ find . -perm 754 # 허가권을 숫자로 설정할 수 있다. # 파일 크기가 5GB 이내의 파일을 찾는다. $ find . -size -5G # 파일 크기가 1GB 이상인 파일을 찾으면 홈 디렉터리의 bigfiles 경로로 이동한다. $ find . -size + 1G - exec mv '{}' ~/bigfiles ₩; # 파일 이름이 '.log'로 끝나는 파일을 찾아 삭제한다. $ find . -name '*.log' -print0 | xargs -0 rm -f # 정규식 표현으로 패턴을 지정한다. # 파일 이름이 a, b, c로 시작하는 파일을 찾는다. $ find . -name '[abc]*' # 마지막 변경 시간이 하루에서 이틀사이인 파일을 찾는다. $ find . -ctime +1 -ctime -2