실습 환경 세팅

- VirtualBox 및 extension pack 설치

- Host Key Combo(HostKey 조합)

  • 환경설정 > 일반 > 입력 > 가상 머신
  • Host OS <> Guest OS
  • Guest → Host 빠져나오는 설정
  • 기본 설정: Right Control
  • 변경: Shift + Ctrl + Alt (강사님 추천)

- VirtualBox 주요 네트워크

  • Bridged
    • 물리 머신과 동일한 물리 네트워크에 가상 머신을 연결하는 네트워크
  • NAT
    • NAT를 통해 외부 네트워크와 연결될 수 있는 네트워크로 개별 가상 머신 별 독립적인 네트워크를 제공하는 네트워크
    • Host OS에서 NAT의 가상 머신에 바로 접근이 되지 않음(직접 접근을 위해서는 별도의 포트 포워딩이 필요)
  • NAT Network
    • NAT를 통해 외부 네트워크와 연결될 수 있는 네트워크로 다른 가상 머신과 통신이 가능한 NAT 네트워크를 제공하는 네트워크
    • Host OS에서 NAT의 가상 머신에 바로 접근이 되지 않음(직접 접근을 위해서는 별도의 포트 포워딩이 필요)
  • Host Only
    • 가상 머신이 외부 네트워크와 연결되지 않는 네트워크
    • Host OS와 직접 통신이 가능한 네트워크

- VM 생성

  • Name: Rocky Linux 9
  • OS: Red Hat(64-bit)
  • Memory: 2GB
  • Network: 네트워크 어댑터 활성화 + Host Only Adapter

왜 리눅스를 사용하는가?
- 리소스 사용량
윈도우는 GUI 환경 등으로 인해 메모리 사용량이 높음
- 비용
윈도우는 유료인 반면 리눅스는 오픈소스 기반이므로 무료 버전이 많음
- 하드웨어 성능이 좋아짐에 따라 유닉스보다 리눅스를 더 많이 사용하게 됨
- 다중 사용자 특성

CLI 명령어 구문

COMMAND [OPTION] [ARGUMENT]

COMMAND

  • 시스템에서 작업을 수행하기 위해 실행하는 실행 파일

OPTION

  • 명령어의 실행 방식을 결정하기 위한 구성 요소
  • “-” 기호로 시작함

ARGUMENT

  • 명령어에서 처리할 데이터(파일이름, 경로, 데이터 등)를 전달하기 위한 구성 요소

명령어 도움말 확인 방법

1) 명령어 --help : 명령어 문법, 옵션 목록을 간략히 확인

2) man 명령어: 명령어에 대한 자세한 설명 확인

매뉴얼 페이지 활용

$ man -f KEYWORD # 해당 명령어에 대한 매뉴얼 페이지 검색
$ man -k KEYWORD # 키워드가 포함된 명령어에 대한 매뉴얼 페이지 검색
$ man -s SECTION_NUM MAN_PAGE # 해당 섹션에 있는 매뉴얼 페이지 열람
# 매뉴얼 페이지는 용도에 따라 섹션으로 분류됨

디렉토리 및 파일 보기

  • File
    • 데이터를 포함하는 디스크에 저장되기 위한 논리적인 단위
  • Directory
    • 파일을 포함하기 위한 특수한 파일

Unix Root Directory - Wikipedia

  • 작업 디렉터리
    • 현재 작업하고 있는 디렉터리
    • 명령어를 실행할 때 기준이 되는 경로
  • 절대 경로
    • 최상위 디렉터리(/)로부터 시작하는 전체 경로
  • 상대 경로
    • 작업 디렉터리로부터 대상 파일/디렉터리까지의 상대적인 경로
  • .
    • 현재 디렉터리
  • ..
    • 상위 디렉터리

파일 내용 확인

cat filename
more filename # 현재 터미널에서 출력
less filename # 내용을 보고 q를 눌러 빠져나옴
head [-n] filename # 상단 n줄(default=10) 출력
tail [-n] filename # 하단 n줄(default=10) 출력
tail [+n] filename # n번째 행부터 하단 출력 (Unix)
tail -n [+n] filename # (Linux)
wc [OPTION] filename # word count, 행/단어/문자수 확인
# -l: 행, -w: 단어, -c: bytes, -m: char

디렉토리 및 파일 내용 변경

[root@localhost cups]# mkdir /work
[root@localhost cups]# chmod 777 /work
[user@localhost ~]$ cd /work
[user@localhost work]$ ls -ld /work
drwxrwxrwx. 2 root root 6 Sep 19 11:18 /work
[user@localhost work]$ 
[user@localhost work]$ mkdir 20250919
[user@localhost work]$ cd 20250919/
[user@localhost 20250919]$ pwd
/work/20250919
[user@localhost 20250919]$ mkdir dira
[user@localhost 20250919]$ mkdir dirb
[user@localhost 20250919]$ mkdir dirc
[user@localhost 20250919]$ pwd
/work/20250919
[user@localhost 20250919]$ ls -l
total 0
drwxr-xr-x. 2 user user 6 Sep 19 11:22 dira
drwxr-xr-x. 2 user user 6 Sep 19 11:22 dirb
drwxr-xr-x. 2 user user 6 Sep 19 11:22 dirc
[user@localhost 20250919]$ cd dira
[user@localhost dira]$ pwd
/work/20250919/dira
[user@localhost dira]$ touch filea
[user@localhost dira]$ ls -l
total 0
-rw-r--r--. 1 user user 0 Sep 19 11:23 filea
[user@localhost dira]$ touch fileb
[user@localhost dira]$ ls -l
total 0
-rw-r--r--. 1 user user 0 Sep 19 11:23 filea
-rw-r--r--. 1 user user 0 Sep 19 11:23 fileb
[user@localhost dira]$ cat filea
[user@localhost dira]$ cat fileb
[user@localhost dira]$ ls -l
total 0
-rw-r--r--. 1 user user 0 Sep 19 11:23 filea
-rw-r--r--. 1 user user 0 Sep 19 11:23 fileb
[user@localhost dira]$ date
Fri Sep 19 11:24:31 AM KST 2025
[user@localhost dira]$ 

복사

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
[user@localhost dira]$ cp /etc/hosts filec
[user@localhost dira]$ cp /etc/hosts ./filed
[user@localhost dira]$ ls -l
total 8
-rw-r--r--. 1 user user   0 Sep 19 11:23 filea
-rw-r--r--. 1 user user   0 Sep 19 11:25 fileb
-rw-r--r--. 1 user user 158 Sep 19 11:29 filec
-rw-r--r--. 1 user user 158 Sep 19 11:30 filed
[user@localhost dira]$ cp /etc/hosts .
[user@localhost dira]$ ls -l
total 12
-rw-r--r--. 1 user user   0 Sep 19 11:23 filea
-rw-r--r--. 1 user user   0 Sep 19 11:25 fileb
-rw-r--r--. 1 user user 158 Sep 19 11:29 filec
-rw-r--r--. 1 user user 158 Sep 19 11:30 filed
-rw-r--r--. 1 user user 158 Sep 19 11:31 hosts
[user@localhost dira]$ cp /etc/passwd /etc/crontab .
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
-rw-r--r--. 1 user user    0 Sep 19 11:23 filea
-rw-r--r--. 1 user user    0 Sep 19 11:25 fileb
-rw-r--r--. 1 user user  158 Sep 19 11:29 filec
-rw-r--r--. 1 user user  158 Sep 19 11:30 filed
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
[user@localhost dira]$ 
[user@localhost dira]$ cp -R /etc/cups . # 디렉토리 복사
[user@localhost dira]$ pwd
/work/20250919/dira
[user@localhost dira]$ cd ../dirb
[user@localhost dirb]$ pwd
/work/20250919/dirb
[user@localhost dirb]$ cp -R ../dira .
[user@localhost dirb]$ ls -l
total 0
drwxr-xr-x. 3 user user 112 Sep 19 11:41 dira
[user@localhost dirb]$ ls -l dira
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:41 crontab
drwxr-xr-x. 4 user user  166 Sep 19 11:41 cups
-rw-r--r--. 1 user user    0 Sep 19 11:41 filea
-rw-r--r--. 1 user user    0 Sep 19 11:41 fileb
-rw-r--r--. 1 user user  158 Sep 19 11:41 filec
-rw-r--r--. 1 user user  158 Sep 19 11:41 filed
-rw-r--r--. 1 user user  158 Sep 19 11:41 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:41 passwd
[user@localhost dirb]$ cd ..
[user@localhost 20250919]$ ls
dira  dirb  dirc
[user@localhost 20250919]$ cd dirc
[user@localhost dirc]$ cp -R ../dira ../dirb .
[user@localhost dirc]$ ls -l
total 0
drwxr-xr-x. 3 user user 112 Sep 19 11:43 dira
drwxr-xr-x. 3 user user  18 Sep 19 11:43 dirb
[user@localhost dirc]$ 

 

  • 파일 복사
      $ cp SOURCE_FILE TARGET_FILE
      $ cp SOURCE_FILE DESTINATION_DIR
    (2) 복수 원본 파일 복사
  • $ cp SOURCE_FILE1 SOURCE_FILE2 ... SOURCE_FILEN DESTINATION_DIR
  • (1) 단일 원본 파일 복사
  • 디렉터리 복사
      $ cp -r SOURCE_DIR TARGET_DIR
      $ cp -r SOURCE_DIR DESTINATION_DIR
    (2) 복수 원본 디렉터리 복사
  • $ cp -r SOURCE_DIR1 SOURCE_DIR2 ... SOURCE_DIRN DESTINATION_DIR
  • (1) 단일 원본 디렉터리 복사

이동 / 이름 변경

mv: 파일 및 디렉터리의 1. 이동 / 2. 이름 변경

mv SOURCE_FILE DESTINATION # 파일 이동
mv ORIGINAL_DIRECTORY DESTINATION # 디렉터리 이동
mv ORIGINAL_FILE NEW_FILENAME # 파일 이름 변경
[user@localhost dirc]$ cd ..
[user@localhost 20250919]$ ls
dira  dirb  dirc
[user@localhost 20250919]$ mkdir dird
[user@localhost 20250919]$ ls -l dird
total 0
[user@localhost 20250919]$ cd dira
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
drwxr-xr-x. 4 user user  166 Sep 19 11:39 cups
-rw-r--r--. 1 user user    0 Sep 19 11:23 filea
-rw-r--r--. 1 user user    0 Sep 19 11:25 fileb
-rw-r--r--. 1 user user  158 Sep 19 11:29 filec
-rw-r--r--. 1 user user  158 Sep 19 11:30 filed
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
**[user@localhost dira]$ mv filea ../dird/**
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
drwxr-xr-x. 4 user user  166 Sep 19 11:39 cups
-rw-r--r--. 1 user user    0 Sep 19 11:25 fileb
-rw-r--r--. 1 user user  158 Sep 19 11:29 filec
-rw-r--r--. 1 user user  158 Sep 19 11:30 filed
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
[user@localhost dira]$ ls -l ../dird
total 0
-rw-r--r--. 1 user user 0 Sep 19 11:23 filea
**[user@localhost dira]$ mv fileb ../dird/**
[user@localhost dira]$ ls -l ../dird
total 0
-rw-r--r--. 1 user user 0 Sep 19 11:23 filea
-rw-r--r--. 1 user user 0 Sep 19 11:25 fileb
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
drwxr-xr-x. 4 user user  166 Sep 19 11:39 cups
-rw-r--r--. 1 user user  158 Sep 19 11:29 filec
-rw-r--r--. 1 user user  158 Sep 19 11:30 filed
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
-rw-r--r--. 1 user user  158 Sep 19 11:29 filec
-rw-r--r--. 1 user user  158 Sep 19 11:30 filed
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
**[user@localhost dira]$ mv filec file3
[user@localhost dira]$ mv filed file4**
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
-rw-r--r--. 1 user user  158 Sep 19 11:29 file3
-rw-r--r--. 1 user user  158 Sep 19 11:30 file4
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
[user@localhost dira]$ mkdir subdir1
[user@localhost dira]$ mkdir subdir2
[user@localhost dira]$ cp file3 file4 subdir1
[user@localhost dira]$ cp crontab passwd subdir2
[user@localhost dira]$ ls -l subdir1
total 8
-rw-r--r--. 1 user user 158 Sep 19 13:23 file3
-rw-r--r--. 1 user user 158 Sep 19 13:23 file4
[user@localhost dira]$ ls -l subdir2
total 8
-rw-r--r--. 1 user user  451 Sep 19 13:23 crontab
-rw-r--r--. 1 user user 1935 Sep 19 13:23 passwd
**[user@localhost dira]$ mv subdir1 testdir1
[user@localhost dira]$ mv subdir2 testdir2**
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
-rw-r--r--. 1 user user  158 Sep 19 11:29 file3
-rw-r--r--. 1 user user  158 Sep 19 11:30 file4
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
drwxr-xr-x. 2 user user   32 Sep 19 13:23 testdir1
drwxr-xr-x. 2 user user   35 Sep 19 13:23 testdir2
[user@localhost dira]$ ls -l testdir1
total 8
-rw-r--r--. 1 user user 158 Sep 19 13:23 file3
-rw-r--r--. 1 user user 158 Sep 19 13:23 file4
[user@localhost dira]$ ls -l testdir2
total 8
-rw-r--r--. 1 user user  451 Sep 19 13:23 crontab
-rw-r--r--. 1 user user 1935 Sep 19 13:23 passwd

 

삭제

rm FILE # 파일 삭제
rmdir DIR # 빈 디렉토리 삭제
rm -r DIR # 파일이 있는 디렉토리 삭제
rm -i FILE|DIR # 대화형(root는 default)
rm -rf DIR # 강제 삭제, 대화 무시
[user@localhost dira]$ ls -l
total 20
-rw-r--r--. 1 user user  451 Sep 19 11:34 crontab
-rw-r--r--. 1 user user  158 Sep 19 11:29 file3
-rw-r--r--. 1 user user  158 Sep 19 11:30 file4
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
drwxr-xr-x. 2 user user   32 Sep 19 13:23 testdir1
drwxr-xr-x. 2 user user   35 Sep 19 13:23 testdir2
**[user@localhost dira]$ rm crontab**
[user@localhost dira]$ ls -l
total 16
-rw-r--r--. 1 user user  158 Sep 19 11:29 file3
-rw-r--r--. 1 user user  158 Sep 19 11:30 file4
-rw-r--r--. 1 user user  158 Sep 19 11:31 hosts
-rw-r--r--. 1 user user 1935 Sep 19 11:34 passwd
drwxr-xr-x. 2 user user   32 Sep 19 13:23 testdir1
drwxr-xr-x. 2 user user   35 Sep 19 13:23 testdir2
**[user@localhost dira]$ rm passwd**
[user@localhost dira]$ ls -l
total 12
-rw-r--r--. 1 user user 158 Sep 19 11:29 file3
-rw-r--r--. 1 user user 158 Sep 19 11:30 file4
-rw-r--r--. 1 user user 158 Sep 19 11:31 hosts
drwxr-xr-x. 2 user user  32 Sep 19 13:23 testdir1
drwxr-xr-x. 2 user user  35 Sep 19 13:23 testdir2
[user@localhost dira]$ mkdir testdir3
[user@localhost dira]$ mkdir testdir4
[user@localhost dira]$ ls -l
total 12
-rw-r--r--. 1 user user 158 Sep 19 11:29 file3
-rw-r--r--. 1 user user 158 Sep 19 11:30 file4
-rw-r--r--. 1 user user 158 Sep 19 11:31 hosts
drwxr-xr-x. 2 user user  32 Sep 19 13:23 testdir1
drwxr-xr-x. 2 user user  35 Sep 19 13:23 testdir2
drwxr-xr-x. 2 user user   6 Sep 19 13:28 testdir3
drwxr-xr-x. 2 user user   6 Sep 19 13:28 testdir4
**[user@localhost dira]$ rmdir testdir3
[user@localhost dira]$ rmdir testdir4**
[user@localhost dira]$ ls -l
total 12
-rw-r--r--. 1 user user 158 Sep 19 11:29 file3
-rw-r--r--. 1 user user 158 Sep 19 11:30 file4
-rw-r--r--. 1 user user 158 Sep 19 11:31 hosts
drwxr-xr-x. 2 user user  32 Sep 19 13:23 testdir1
drwxr-xr-x. 2 user user  35 Sep 19 13:23 testdir2
[user@localhost dira]$ rmdir testdir1
rmdir: failed to remove 'testdir1': Directory not empty
**[user@localhost dira]$ rm -r testdir1
[user@localhost dira]$ rm -r testdir2**
[user@localhost dira]$ ls -l
total 12
-rw-r--r--. 1 user user 158 Sep 19 11:29 file3
-rw-r--r--. 1 user user 158 Sep 19 11:30 file4
-rw-r--r--. 1 user user 158 Sep 19 11:31 hosts
[user@localhost dira]$ 
[root@localhost 20250919]# ls -l
total 0
drwxr-xr-x. 2 user user 45 Sep 19 13:33 dira
drwxr-xr-x. 3 user user 18 Sep 19 11:41 dirb
drwxr-xr-x. 5 user user 42 Sep 19 11:50 dirc
drwxr-xr-x. 3 user user 44 Sep 19 13:15 dird
[root@localhost 20250919]# cd dirc
[root@localhost dirc]# ls -l
total 0
drwxr-xr-x. 3 user user 112 Sep 19 11:43 dira
drwxr-xr-x. 3 user user  18 Sep 19 11:43 dirb
drwxr-xr-x. 4 user user 124 Sep 19 11:51 dirc
[root@localhost dirc]# touch rootfilea
[root@localhost dirc]# touch rootfileb
[root@localhost dirc]# touch rootfilec
[root@localhost dirc]# ls -l
total 0
drwxr-xr-x. 3 user user 112 Sep 19 11:43 dira
drwxr-xr-x. 3 user user  18 Sep 19 11:43 dirb
drwxr-xr-x. 4 user user 124 Sep 19 11:51 dirc
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfilea
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfileb
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfilec
**[root@localhost dirc]# rm rootfilea
rm: remove regular empty file 'rootfilea'? n**
[root@localhost dirc]# ls -l
total 0
drwxr-xr-x. 3 user user 112 Sep 19 11:43 dira
drwxr-xr-x. 3 user user  18 Sep 19 11:43 dirb
drwxr-xr-x. 4 user user 124 Sep 19 11:51 dirc
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfilea
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfileb
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfilec
**[root@localhost dirc]# rm rootfilea
rm: remove regular empty file 'rootfilea'? y**
[root@localhost dirc]# ls -l
total 0
drwxr-xr-x. 3 user user 112 Sep 19 11:43 dira
drwxr-xr-x. 3 user user  18 Sep 19 11:43 dirb
drwxr-xr-x. 4 user user 124 Sep 19 11:51 dirc
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfileb
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfilec
[root@localhost dirc]# 
[root@localhost dirc]# ls -l
total 0
drwxr-xr-x. 3 user user 112 Sep 19 11:43 dira
drwxr-xr-x. 3 user user  18 Sep 19 11:43 dirb
drwxr-xr-x. 4 user user 124 Sep 19 11:51 dirc
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfileb
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfilec
[root@localhost dirc]# rm -r dira
rm: descend into directory 'dira'? y
rm: descend into directory 'dira/cups'? y
rm: remove regular file 'dira/cups/client.conf'? y
rm: remove regular file 'dira/cups/cups-browsed.conf.rpmsave'? y
rm: remove regular file 'dira/cups/cups-browsed.conf'? y
rm: remove regular empty file 'dira/cups/lpoptions'? y
rm: remove regular file 'dira/cups/snmp.conf'? y
rm: remove regular file 'dira/cups/client.conf.rpmsave'? y
rm: remove directory 'dira/cups/ppd'? y
rm: remove directory 'dira/cups/ssl'? y
rm: remove directory 'dira/cups'? ^C
**[root@localhost dirc]# rm -rf dira**
[root@localhost dirc]# ls -l
total 0
drwxr-xr-x. 3 user user  18 Sep 19 11:43 dirb
drwxr-xr-x. 4 user user 124 Sep 19 11:51 dirc
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfileb
-rw-r--r--. 1 root root   0 Sep 19 13:37 rootfilec
[root@localhost dirc]# 

 

링크

  • 하드 링크(Hard Link)
    • 파일이 물리적으로 저장된 주소를 가리키는 링크
    • 가리킬 수 있는 대상: 같은 파일 시스템 내에 존재하는 파일
    • inode 값을 공유함
    • 원본 파일이 삭제되더라도 하드 링크를 통해 원본 데이터에 접근이 가능함
    • 원본, 하드 링크에서 권한 변경 시 동일한 권한으로 설정됨
  • 심볼릭 링크(Symbolic Link)
    • 파일이 저장된 논리적인 경로를 가리키는 링크
    • 가리킬 수 있는 대상: 같은/다른 파일 시스템 내에 존재하는 파일 및 디렉터리
    • inode 값을 공유하지 않음
    • 원본 파일이 삭제되는 경우 심볼릭 링크를 통해 원본 데이터에 접근이 불가함
    • 심볼릭 링크 파일에서 권한 설정 시 심볼릭 링크 파일과 연결된 원본 파일에 권한이 설정됨

ln [OPTION]... [-T] TARGET LINK_NAME
ln [OPTION]... TARGET
ln [OPTION]... TARGET... DIRECTORY
ln [OPTION]... -t DIRECTORY TARGET...
ln ORIGINAL HARDLINK # 하드 링크 생성
ln -s ORIGINAL SYMBOLIC_LINK # 심볼릭 링크 생성
[user@localhost dire]$ ls -al
total 0
drwxr-xr-x. 2 user user  6 Sep 19 14:24 .
drwxr-xr-x. 7 user user 66 Sep 19 14:24 ..
[user@localhost dire]$ touch original
[user@localhost dire]$ echo "Original File" > original
[user@localhost dire]$ gedit original &
[1] 5503
[user@localhost dire]$ man ln
[1]+  Done                    gedit original
[user@localhost dire]$ ln original link_hard
[user@localhost dire]$ ls -l
total 8
-rw-r--r--. 2 user user 14 Sep 19 14:28 link_hard
-rw-r--r--. 2 user user 14 Sep 19 14:28 original
**[user@localhost dire]$ ls -li # inode**
total 8
34784591 -rw-r--r--. 2 user user 14 Sep 19 14:28 link_hard
34784591 -rw-r--r--. 2 user user 14 Sep 19 14:28 original
[user@localhost dire]$ cp original file_copy
[user@localhost dire]$ ls -li
total 12
**34784589** -rw-r--r--. **1** user user 14 Sep 19 14:33 file_copy
**34784591** -rw-r--r--. **2** user user 14 Sep 19 14:28 link_hard
**34784591** -rw-r--r--. **2** user user 14 Sep 19 14:28 original
# inode permissions hard_links_count
[user@localhost dire]$ cat original
Original File
[user@localhost dire]$ cat file_copy
Original File
[user@localhost dire]$ gedit file_copy # Original File -> Copy File
[user@localhost dire]$ cat original
Original File
[user@localhost dire]$ cat file_copy
Copy File
---
# 하드 링크의 원본 파일 삭제
[user@localhost dire]$ ls -li
total 12
34784592 -rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
34784591 -rw-r--r--. 2 user user 35 Sep 19 14:42 link_hard
34784591 -rw-r--r--. 2 user user 35 Sep 19 14:42 original
[user@localhost dire]$ rm original
[user@localhost dire]$ ls -li
total 8
34784592 -rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
34784591 -rw-r--r--. 1 user user 35 Sep 19 14:42 link_hard
[user@localhost dire]$ cat link_hard
Original File
1111 2222
3333 4444

파일 삭제: 하드 링크 개수가 0이 되면 디스크에서 삭제됨

# 디스크 용량 차지 확인
[user@localhost dire]$ ln link_hard original
[user@localhost dire]$ ls -li
total 12
34784592 -rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
34784591 -rw-r--r--. 2 user user 35 Sep 19 14:42 link_hard
34784591 -rw-r--r--. 2 user user 35 Sep 19 14:42 original
[user@localhost dire]$ du -h original
4.0K    original
[user@localhost dire]$ du -h .
8.0K    .
# 심볼릭 링크 생성
[user@localhost dire]$ ls -l
total 12
-rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
-rw-r--r--. 2 user user 35 Sep 19 14:42 link_hard
-rw-r--r--. 2 user user 35 Sep 19 14:42 original
[user@localhost dire]$ ln -s original link_sym
[user@localhost dire]$ ls -l
total 12
-rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
-rw-r--r--. 2 user user 35 Sep 19 14:42 link_hard
**lrwxrwxrwx. 1 user user  8 Sep 19 15:08 link_sym -> original**
-rw-r--r--. 2 user user 35 Sep 19 14:42 original
---
# 심볼릭 링크의 원본 파일 삭제
[user@localhost dire]$ rm original
[user@localhost dire]$ ls -li
total 8
34784592 -rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
34784591 -rw-r--r--. 1 user user 45 Sep 19 15:10 link_hard
34784589 lrwxrwxrwx. 1 user user  8 Sep 19 15:08 link_sym -> original
[user@localhost dire]$ cat link_sym
**cat: link_sym: No such file or directory**
---
# 심볼릭 링크 파일 이동
[user@localhost dire]$ mkdir subdir1
[user@localhost dire]$ mkdir subdir2
[user@localhost dire]$ touch subdir1/original
[user@localhost dire]$ gedit subdir1/original &
[1] 6152
[user@localhost dire]$ cat subdir1/original
New Original File
[1]+  Done                    gedit subdir1/original
[user@localhost dire]$ mv link_sym subdir1/
[user@localhost dire]$ cd subdir1
[user@localhost subdir1]$ ls -li
total 4
34784589 lrwxrwxrwx. 1 user user  8 Sep 19 15:08 link_sym -> original
17590560 -rw-r--r--. 1 user user 19 Sep 19 15:15 original
[user@localhost subdir1]$ cat link_sym
New Original File
---
[user@localhost subdir1]$ cd ..
[user@localhost dire]$ ls -l
total 8
-rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
-rw-r--r--. 1 user user 45 Sep 19 15:10 link_hard
drwxr-xr-x. 2 user user 38 Sep 19 15:16 subdir1
drwxr-xr-x. 2 user user  6 Sep 19 15:13 subdir2
[user@localhost dire]$ ln link_hard original
[user@localhost dire]$ ls -l
total 12
-rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
-rw-r--r--. 2 user user 45 Sep 19 15:10 link_hard
-rw-r--r--. 2 user user 45 Sep 19 15:10 original
drwxr-xr-x. 2 user user 38 Sep 19 15:16 subdir1
drwxr-xr-x. 2 user user  6 Sep 19 15:13 subdir2
[user@localhost dire]$ ln -s original subdir2/link_sym2
[user@localhost dire]$ ls -li
total 12
34784592 -rw-r--r--. 1 user user 10 Sep 19 14:34 file_copy
34784591 -rw-r--r--. 2 user user 45 Sep 19 15:10 link_hard
34784591 -rw-r--r--. 2 user user 45 Sep 19 15:10 original
17590534 drwxr-xr-x. 2 user user 38 Sep 19 15:16 subdir1
34784593 drwxr-xr-x. 2 user user 23 Sep 19 15:20 subdir2
[user@localhost dire]$ ls -li subdir2/
total 0
34784594 lrwxrwxrwx. 1 user user 8 Sep 19 15:20 link_sym2 -> original
[user@localhost dire]$ cat subdir2/link_sym2
cat: subdir2/link_sym2: No such file or directory

심볼릭 링크가 링크하는 주소에 파일이 존재하지 않으면 연결이 깨진 상태로 링크 파일이 존재


파일 및 디렉토리 검색

파일 내용 검색

 

grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]

# -i: 대소문자 무시
# -n: 매칭되는 줄 번호를 함께 출력
# -w: 단어 단위 검색
# -v: inverse(역). 제외하고 검색
# -A NUM, --after-context=NUM: 검색된 것 뒤의 NUM개 행 추가 출력
# -C NUM, --context=NUM: center. 앞뒤로 NUM개 행 추가 출력
# -e PATTERN: PATTERN 복수 조건 지정(지정할 패턴 조건 개수 만큼 "-e PATTERN" 지정)
# -B NUM :  패턴 행 이전의 행을 같이 출력
# -A NUM :  패턴 행 이후의 행을 같이 출력
# -C NUM :  패턴 행 전후의 행을 같이 출력
[user@localhost dira]$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[user@localhost dira]$ grep -A 3 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

[user@localhost dira]$ grep -C 3 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
--
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

[user@localhost dira]$ grep -e user -e root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
clevis:x:993:992:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/usr/sbin/nologin
chrony:x:987:986:chrony system user:/var/lib/chrony:/sbin/nologin
user:x:1000:1000:user:/home/user:/bin/bash

정규 표현식(Regular Expression)

  • 규칙성 있는 문자열에 대해 정의하기 위한 표현식

^ : 행의 시작 지정

$ : 행의 끝 지정

. : 임의의 한 문자

  • : 하나도 없거나 여러 문자로 대치

[ ] : [ ] 안에 정의되는 패턴 중 한 문자와 대치

[^] : [ ] 안에 정의되는 패턴 중 제외할 문자

[user@localhost dira]$ grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[user@localhost dira]$ grep '^user' /etc/passwd
user:x:1000:1000:user:/home/user:/bin/bash
[user@localhost dira]$ grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
user:x:1000:1000:user:/home/user:/bin/bash
[user@localhost dira]$ grep 'u..r' /etc/passwd
clevis:x:993:992:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/usr/sbin/nologin
chrony:x:987:986:chrony system user:/var/lib/chrony:/sbin/nologin
user:x:1000:1000:user:/home/user:/bin/bash
[user@localhost dira]$ grep 'o*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
..
[user@localhost dira]$ touch example1.txt
[user@localhost dira]$ gedit example1.txt
[user@localhost dira]$ cat example1.txt
cat
dog
concatnate
door
cool
Door
a1234t
abcdet
aaat
baat
coat
caat
cbbt
1111
2222
3333

[user@localhost dira]$ grep '[0-9][0-9][0-9][0-9]' example1.txt
a1234t
1111
2222
3333
[user@localhost dira]$ grep -w '[0-9][0-9][0-9][0-9]' example1.txt
1111
2222
3333
[user@localhost dira]$ grep 'c[a-c][a-c]t' example1.txt
caat
cbbt
[user@localhost dira]$ grep 'c[^a-c][^a-c]t' example1.txt
abcdet

확장 정규 표현식

  • : 특정한 문자 앞에 하나 이상의 문자가 있음

x|y : x 또는 y

(abc|def) : 문자 abc 또는 def

[user@localhost dira]$ gedit example2.txt &
[1] 6946
[user@localhost dira]$ cat example2.txt
education
community
Communication
Vidication
cat
dog
chillidog
No Entry
Networking

[1]+  Done                    gedit example2.txt
[user@localhost dira]$ egrep '[a-z]+tion' example2.txt
education
Communication
Vidication
[user@localhost dira]$ egrep '[A-Z]+tion' example2.txt
[user@localhost dira]$ egrep '[a-zA-Z]+tion' example2.txt
education
Communication
Vidication
[user@localhost dira]$ egrep '[nN](o|e)+' example2.txt
No Entry
Networking
[user@localhost dira]$ egrep '(cat|dog)' example2.txt
education
Communication
Vidication
cat
dog
chillidog

fgrep(fixed grep)

[user@localhost dira]$ gedit example3.txt
[user@localhost dira]$ cat example3.txt
user01:*LK*:test1234
user02:*LK*:test1234
user03:1234:test1234
user04:$100:test1234
user04:abcd:test1234

[user@localhost dira]$ egrep '*LK*' example3.txt
user01:*LK*:test1234
user02:*LK*:test1234
[user@localhost dira]$ fgrep '*LK*' example3.txt
user01:*LK*:test1234
user02:*LK*:test1234

파일 및 디렉토리 검색

find pathname expression action
# pathname: 디렉터리에서 파일을 검색할 기준 경로
# expression: 파일 검색 조건
# action: 파일 검색 후 동작 지정

EXPRESSION

-name FILENAME: 특정 파일 이름을 지정

-type TYPE: 특정 파일 종류를 지정

파일: f, 디렉터리: d, 심볼릭 링크: l

-user USER: 파일의 소유자를 지정하여 검색

-group GROUP: 파일의 소유 그룹을 지정하여 검색

-size [+|-]SIZE: 파일의 용량을 지정하여 검색

b: bytes, k: KB, M: MB, G: GB

ACTION

-print: 파일 검색 결과를 출력(기본 동작)

-ls: 파일의 각 속성들을 필드로 정리해서 출력(ls -l과 비슷)

-exec COMMAND {} ; : 찾은 파일에 대해 지정된 명령어를 수행

-ok COMMAND {} ; : exec와 같이 추가 작업을 실행하지만 각 파일에 대해 작업을 수행할지 확인 후 작업 수행

{}: 찾은 파일들을 의미

[root@localhost dirc]# find / -name hosts
find: ‘/run/user/1000/doc’: Permission denied
find: ‘/run/user/1000/gvfs’: Permission denied
/etc/hosts
/etc/avahi/hosts
/work/20250919/dira/hosts
/work/20250919/dirb/dira/hosts
/work/20250919/dirc/dirb/dira/hosts
/work/20250919/dirc/dirc/hosts
/work/20250919/dirc/dirc/dira/hosts
[root@localhost dirc]# find / -name "*.conf"
/boot/loader/entries/61c3a8cec342434086c3eaec15712516-5.14.0-570.17.1.el9_6.x86_64.conf
/boot/loader/entries/61c3a8cec342434086c3eaec15712516-0-rescue.conf
..
[root@localhost dirc]# find / -name "*.conf" -o -name "*.cnf" 
# -o: or
[root@localhost dirc]# mkdir /work/config
[root@localhost dirc]# find /etc -name "*.conf" -exec cp {} /work/config/ \;
[root@localhost dirc]# ls -l /work/config
total 1612
-rw-r--r--. 1 root root   7765 Sep 19 17:30 000-shortnames.conf
-rw-r--r--. 1 root root    311 Sep 19 17:30 00-keyboard.conf
-rw-r--r--. 1 root root    141 Sep 19 17:30 01-permitrootlogin.conf
..
[root@localhost dirc]# mkdir ~/testdir1/
[root@localhost dirc]# touch ~/testdir1/test{a..d}
[root@localhost dirc]# ls -l ~/testdir1
total 0
-rw-r--r--. 1 root root 0 Sep 19 17:32 testa
-rw-r--r--. 1 root root 0 Sep 19 17:32 testb
-rw-r--r--. 1 root root 0 Sep 19 17:32 testc
-rw-r--r--. 1 root root 0 Sep 19 17:32 testd
[root@localhost dirc]# find /root/testdir1/ -name "test?" -ok chgrp wheel {} \;
< chgrp ... /root/testdir1/testa > ? n
< chgrp ... /root/testdir1/testb > ? n
< chgrp ... /root/testdir1/testc > ? n
< chgrp ... /root/testdir1/testd > ? n
[root@localhost dirc]# ls -l ~/testdir1
total 0
-rw-r--r--. 1 root root 0 Sep 19 17:32 testa
-rw-r--r--. 1 root root 0 Sep 19 17:32 testb
-rw-r--r--. 1 root root 0 Sep 19 17:32 testc
-rw-r--r--. 1 root root 0 Sep 19 17:32 testd
[root@localhost dirc]# find /root/testdir1/ -name "test?" -ok chgrp wheel {} \;
< chgrp ... /root/testdir1/testa > ? y
< chgrp ... /root/testdir1/testb > ? y
< chgrp ... /root/testdir1/testc > ? y
< chgrp ... /root/testdir1/testd > ? y
[root@localhost dirc]# ls -l ~/testdir1
total 0
-rw-r--r--. 1 root wheel 0 Sep 19 17:32 testa
-rw-r--r--. 1 root wheel 0 Sep 19 17:32 testb
-rw-r--r--. 1 root wheel 0 Sep 19 17:32 testc
-rw-r--r--. 1 root wheel 0 Sep 19 17:32 testd

 


주요 명령어 정리

  • man
    • -k: 키워드 검색
  • [COMMAND] --help
  • cat, more, head, tail, grep
    • tail
      • 활용: 최근 로그 확인
  • cp [-r] , mv [-r] , rm [-r]
  • touch , mkdir
  • ln [-s]
  • grep [option].. <pattern> <FILE>
    • ^: 줄의 시작 지정, 항상 검색어 앞에 위치
      • 활용: 설정 파일 내 설정 항목 검색
    • -v: 검색어 제외
      • 활용: 주석 제외
    • $: 줄의 마지막 지정, 항상 검색어 뒤에 위치
    • .: 한 문자 대치
    • -w: 단어 단위 검색
    • : 아무것도 없거나 여러 문자 대치(앞에 오는 글자 기준) (ex. rot, r.*t(.이 오면 아무 문자))
    • []: 패턴 중 한 문자 대치(ex. r[abcdo]t /etc/passwd)
    • -i: 대소문자 무시
  • erep , fgrep
  • find <PATH> <WHAT:OPTIONS+ARG> [ACTIONS:OPTIONS+ARG]
    • 특정 디렉토리 기준 하위 파일 검색
    • -type: 파일 종류
      • file 명령어와 함께 많이 사용
    • -name <pattern>: 파일 이름
    • -perm: 파일 권한
    • -size <n>[+/-][cwbkMG]: 사이즈
      • ls -lh : 파일 크기 볼 수 있는 명령어
      • find /etc -size 1k 2> /dev/null | grep passwd
    • -atime , -ctime , -mtime : 파일 시간 정보
      • -atime: last access time
      • -ctime: last changed time
      • -mtime: last modified time
      • -mmin: minutes
      -mtime n
                    File's data was last modified less than, more  than  or  exactly
                    n*24  hours  ago.  See the comments for -atime to understand how
                    rounding affects the interpretation of file modification times.
      
      -ctime n
                    File's  status  was last changed less than, more than or exactly
                    n*24 hours ago.  See the comments for -atime to  understand  how
      
      -amin n
                    File was last accessed less than, more than or exactly n minutes
                    ago.
      
      -mmin n
                    File's  data was last modified less than, more than or exactly n
                    minutes ago.

'OS' 카테고리의 다른 글

시스템 보안(1)  (0) 2025.11.18
Shell Script  (0) 2025.11.06
리눅스 운영 vol.2  (0) 2025.10.21
리눅스 운영 vol.1  (0) 2025.10.13
운영체제 개요 ch.06~ch.08  (0) 2025.09.22

+ Recent posts