System/Linux

[Linux] 하드 링크 & 심볼릭 링크 / 파일 관리 명령어

Yoonsoo Park 2024. 9. 12. 20:30

1. 하드링크와 심볼릭 링크

 하드 링크(Hard Link)

  • 같은 파일을 여러 이름으로 참조하는 방법
  • 같은 파일을 참조한 하드 링크끼리는 인덱스 노드(inode)를 공유한다
    • 같은 하드 링크 파일인지 확인하는 방법: inode가 같은가?
    • 다른 파일 시스템 간에는 별개의 inode 테이블을 참조하기 때문에 같은 파일 시스템 내에서만 하드 링크를 걸 수 있고, 파일 시스템 간 이동도 불가능하다
  • 파일을 처음 생성하게 되면 하드 링크 수는 1
  • 원본 파일을 삭제해도 하드 링크를 통해 파일에 접근 가능 (원본 파일과 하드 링크의 차이가 없다)
  • 하드 링크 파일을 만들면 실제로 파일이 만들어진 것처럼 보이지만 실제로는 용량이 없다
    • 별도의 파일이 생성되는 것이 아닌 이름만 추가되는 것
  • ln 명령어로 하드 링크를 생성한다
ln original_file hardlink_name

<출력결과에서 두번째 필드가 '하드링크수'를 의미>

 

심볼릭 링크(Symbolic Link)

  • 원본 파일 또는 디렉토리의 경로를 참조하는 방법
  • ls -l 명령어 출력결과에 첫글자가 'l'(소문자엘)이면 심볼릭링크
  • 원본파일과 다른 파일 시스템(드라이브)에 있어도 링크가 정상작동함(파일 시스템과 무관)
  • 경로를 기록한 별도의 파일이 생성됨(작지만 용량을 차지한다)
  • 원본 파일이 삭제되거나, 위치가 변경되면 심볼릭 링크 파일은 유효하지 않다 
    • 심볼릭 링크 파일에 기록된 경로와 다르기 때문에 찾아갈 수 없음
    • 이처럼 유효하지 않은 심볼릭 링크 파일을 broken link, dangling link라고 한다
  • ln -s 명령어로 심볼릭 링크를 생성한다
ln -s target_file symlink_name

<Symbolic Link File>

*inode, 파일 시스템의 개념은 나중에 추가로 다룰 예정

 

2. 파일 관리 명령어 

1. pipe => |

: | (파이프) 기호 앞쪽 명령의 출력을 위쪽 명령의 입력으로 방향을 바꿔주는 연산자이다. 설명이 조금 헷갈릴 수 있는데 다음 예시를 통해 조금 더 쉽게 이해해보자.

cat filename.txt | sort

=> cat filename.txt는 파일 내용을 출력하고, 이 출력이 sort로 전달되어 정렬된 결과를 표시
=> 정렬(sort)된 filename.txt를 출력
cat filename.txt | grep "search_term"

=> cat filename.txt는 파일의 내용을 출력하고, 이 출력이 grep "search_term"으로 전달되어 해당 단어가 포함된 줄만 출력
=> "search_term"이 포함된 filename.txt의 내용만 출력

 

 위의 예시처럼 | 연산자를 사용하면 명령어 조합을 통해 복잡한 작업을 간단하게 구현할 수 있다.

 

2. more

: 파일의 내용을 페이지 단위로 끊어서 출력

more [파일명] 
cat file.txt | more

 

3. cat

: 텍스트 파일을 만들어 저장하거나, 화면(터미널, 콘솔)에 출력

  • 텍스트 파일 만들기 
cat > [파일명]

=> 내용 작성 후 ctrl+d

 

  • 텍스트 파일 출력
cat [파일명]

<cat>

4. file

: 파일의 종류를 알려주는 명령어 

=> Windows와 달리 Linux/Unix는 확장자 개념이 없어 파일 종류를 직관적으로 파악할 수 없다)

=> file 명령어를 통해 확인

  • 파일 종류 
텍스트 파일: 단순 글자들로만 구성된 파일
ASCII Text
디렉토리 파일
Directory
심볼릭 링크 파일
Symbolic Link
블록 장치 파일
(Block Device File)
Block Special
캐릭터 장치 파일
(Character Device File)
Character Special
쉘스크립트 실행파일
shell script: ASCII Text Executable
바이너리 실행파일
(Binary Executable File)
: 실행파일(기계어)
윈도우즈의 exe파일과 같은 역할을 수행
리눅스/유닉스의 명령어들은 대부분 실행파일이다.
(쉘 스크립트도 일부 있음)
~~ELF~~ Executable
소켓 파일(Socket File)
: 소켓 통신할 때 사용되는 파일
Socket

 

5. vi 

: 텍스트 파일 편집기, 파일이 없는 경우 새로 생성한다.

  • 명령키를 통해 목적에 맞는 모드로 변경해 사용한다

<vi 모드 구조도>

i 현재 커서 위치부터 입력
a 현재 커서 다음 줄부터 입력
o 다음 줄부터 입력
x 현재 커서 위치부터 1글자 잘라내기
dd 현재 커서 위치의 한 줄을 잘라내기 / 숫자 + dd: [숫자] 줄만큼 삭제 
yy 현재 커서 위치의 한 줄을 복사하기 / 숫자 + yy: [숫자] 줄만큼 복사 
p 현재 커서 위치 다음 줄에 복사 /  숫자 + p: [숫자]줄만큼 복사
u Undo, 작업 취소 (Windows의 Ctrl+z와 같다)
gg 맨 윗 줄로 이동
G 맨 아랫 줄로 이동
[줄 번호]G 원하는 줄로 이동
:set nu 줄 번호 표시 
:q 종료하기
:q! 저장 안 하고 종료하기
:w 저장하기 
:wq 저장하고 종료하기 
/[패턴] 패턴 검색 키워드 찾기 / n: 다음 검색으로 이동 
%s/[패턴]//g 파일의 모든 줄에서 패턴을 찾아 삭제 

 

6. head

:  파일 내용의 상위 10줄 표시 

head [파일명]

head -5 [파일명]
=> 상위 5줄 표시

 

7. tail 

: 파일의 하위 10줄 표시 

tail [파일명]

tail -5 [파일명]
=> 하위 5줄 표시

 

8. cp

: copy, 파일 복사

cp abc.txt bcd.txt 
--> 현재위치에 있는 abc.txt파일을 현재위치에 bcd.txt라는 이름으로 복사하라. 

cp abc.txt testdir1 
 --> 현재위치에 있는 abc.txt파일을 현재위치 밑에 있는 testdir1디렉토리에 복사하라. 

cp abc.txt testdir1/hahaha.txt 
 --> 현재위치에 있는 abc.txt파일을 현재위치 밑에 있는 testdir1디렉토리 안에 hahaha.txt이름으로 복사하라. 

cp abc.txt /tmp 
 --> 현재위치에 있는 abc.txt파일을 /tmp 디렉토리에 같은 이름으로 복사하라.

 

9. mv

: move, 파일/디렉토리 이동, 이름 바꾸기(같은 파일 내에서 mv를 사용할 경우)

mv cde.txt testdir1 
--> 현재위치에 있는 cde.txt파일을 현재위치 밑에 있는 testdir1디렉토리에 이동시킨다
 
 mv efg.txt fgi.txt 
--> 현재위치에 있는 abc.txt파일을 현재위치에 cde.txt라는 이름으로 변경
(한 디렉토리 내에서 mv를 사용할 경우)

mv g.txt testdir1/hohoho.txt 
--> 이동하면서 이름 변경

 

10. rm

: remove, 파일/디렉토리 삭제 

  • rm [파일명]
  • rm -rf: 묻지 않고 강제로 모두 삭제 (주의)
    • -r: recursive(재귀순환, 반복)
    • -f: force. 강제로 진행(묻지 않기)

11. grep 

: Global Regular Expression Print, 정규화 표현식을 이용하여 파일 안의 내용 검색

 

정규화 표현식: 사람이 생각하는 조건들을 기계가 인식할 수 있는 형태로 표현하는 방법

  • ^[단어]: 해당 단어로 시작하는 것을 찾아라
  • [단어]$: 해당 단어로 끝나느 것을 찾아라

<grep 명령어 사용 예시>

 

12. find 

: 저장소(HDD/SSD..)에서 파일/디렉토리를 검색(파일명, 파일크기 등의 파일 속성을 검색)

find / -name 'test'  
--> / 디렉토리부터 이름이 test인 파일을 검색하라. 

find / -name 'test*'  
--> / 디렉토리부터 이름이 test가 들어간 파일을 검색하라. 

find / -size 1000c 
--> / 디렉토리부터 파일크기가 1000글자(바이트)인 것만 검색하라. 

find / -size +100M 
--> / 디렉토리부터 파일크기가 100MB 이상인 것만 검색하라 

find ./ -name 'park*'
--> 현재 디렉토리 이하의 파일과 디렉토리 중 이름이 'park'으로 시작(뒤에 임의의 문자열이 올 수 있음)하는 것을 검색해라
* -->  all (정규화 표현식 아님)

 

 

13. tar(binding, unbinding)

: Tape Archive, 백업용 테이브에 백업 또는 파일 묶기(binding)에 사용

  • 지정한 파일 묶기
  • # tar -cvf <생성할 tar파일 이름> <묶을 파일 이름 또는 디렉터리>
  • c --> combine(묶는다)
  • v --> 작업과정을 화면에 출력하라
  • f --> 묶어서 새로운 파일로 만들어 HDD/SSD 저장하라.(-f 옵션을 안주면 테이프에 백업)
  • mkdir /backup
  • cd /root
  • cp -r ./* /backup (./* = 현재 디렉토리 밑에 모든 데이터를, /backup으로 복사하라)
  • tar cvf test_backup.tar /backup
  • 지정한 파일 묶기 해제
  • # tar -xvf <해제할 tar파일 이름>
  • x --> eXtract (추출하라) --> 풀어라.
  • f --> HDD/SSD에 있는 파일에서 추출하라
  • cd /
  • rm -rf /backup/ <--- 파괴
  • tar xvf test_backup.tar <-- 복구

 

14. gzip, gunzip

: 압축/ 압축 해제

  • gzip으로 파일 압축하기
  • # gzip 압축할파일명
  • # gzip test.txt
  • --> test.txt.gz (원본파일은 삭제됨.)
  • gunzip으로 압축파일 해제하기
  • # gunzip 압축파일명
  • # gunzip test.txt.gz
  • --> test.txt

* tar.gz => tarball 이라고도 지칭

 

 

 

힘들지만 오늘도 해낸 나를 위한 한 마디,

"The greatest glory in living lies not in never falling, but in rising every time we fall", Nelson Mandela