리눅스도 유닉스처럼 시스템과 관련된 정보와 하드웨어 같은 장치를 모두 파일로 관리한다.
파일
관련 있는 정보들의 집합
파일 시스템
디렉토리와 파일로 구성된 전체 집합
데이터를 저장하는데 주로 사용
실행 파일이나 이미지 파일의 경우 데이터가 바이너리 형태로 저장되어 파이너리 파일이라고 한다.
바이너리 파일은 해당 파일의 내용을 확인할 수 있는 특정 응용 프로그램이 있어야 파일의 내용을 확인할 수 있다
반면 텍스트 파일은 파일 내용을 확인하는 명령으로 내용 확인이 가능하며, 문서 편집기를 이용하여 내용을 보거나 편집할 수 있다.
리눅스에서는 디렉토리도 파일로 취급한다.
디렉토리 파일에는 해당 디렉토리에 저장된 파일이나 하위 디렉토리에 대한 정보가 저장된다.
원본 파일을 대신하도록 원본 파일을 다른 파일명으로 지정한 것
윈도우의 바로가기 파일과 유사하다
리눅스에서는 하드디스크나 키보드 같은 각종 장치도 파일로 취급한다.
장치 파일은 리눅스 시스템에 부착된 장치를 관리하기 위한 특수 파일이다.
각종 장치를 관리하기 위해 시스템 관리자는 해당 장치 파일에 접근한다.
대부분의 장치 파일은 /dev 디렉토리 아래에 위치한다.
file 파일명
파일의 종류를 확인하는 명령어
트리 구조
리눅스에서는 파일을 효율적으로 관리하기 위해 데이터를 계층적으로 구성한다.
모든 디렉토리의 출발점은 root 디렉토리(/)이다.
경로명
디렉토리 계층 구조에 있는 특정 파일이나 디렉토리의 위치를 나타내는 것
각 경로를 구분하는 구분자로는 /을 사용
파일과 디렉토리의 이름에는 /를 사용할 수 없다.
알파벳, 숫자, - , _ , 마침표 만 사용한다.
영문은 대문자와 소문자를 구별한다.
마침표로 시작하면 숨김 파일로 간주한다.
pwd(print working directory)
현재 디렉토리의 절대 경로명을 출력한다.
리눅스에서는 다른 사용자의 접근을 막아놓은 디렉토리를 제외하고는 어느 디렉토리든 이동할 수 있다.
파일이나 서브 디렉토리를 생성하는 것은 홈 디렉토리나 권한이 부여된 디렉토리에서만 가능하다.
현재 디렉토리에서 다른 디렉토리로 이동할 때는 cd(change directory)를 이용한다.
목적지 경로명은 절대 경로명이나 상대 경로명 모두 사용 가능하다.
홈 디렉토리로 이동하기 위해서는 다음의 두 가지 방법이 있다.
cd ~
cd
ex: ls -F /tmp
이 경우 해당 디렉토리로 이동하지 않고도 디렉토리의 내용을 확인할 수 있으며, 옵션도 사용 가능하다.
도스 명령에 익숙한 사용자를 위해 제공하는 ls와 유사한 명령어
mkdir 경로명
mkdir 복수의 경로명
mkdir -p 경로명
인자로 지정한 경로명의 중간 단계에 해당하는 디렉토리가 없다면, 중간 단계의 디렉토리까지 포함해서 만들어준다.
rmdir
rmdir 명령으로 디렉토리를 삭제할 때에는 해당 디렉토리가 비어 있어야 한다.
-p옵션을 줄 경우 해당 디렉토리의 부모 디렉토리가 빈 디렉토리일 경우 부모 디렉토리도 삭제한다.
파일 내용을 출력하는 명령은 기본적으로 텍스트 파일의 내용을 출력한다
실행 파일과 같은 바이너리 파일의 경우 일반적인 명령으로 내용을 확인할 수 없다.
cat 명령은 텍스트 파일의 내용을 화면에 연속적으로 출력한다.
-n옵션을 주면 행 번호가 붙어서 출력된다.
more 파일명
내용이 많은 파일은 cat 명령어로 출력하면 자동으로 아래로 스크롤되어 내용 확인이 어렵다
more 명령어로 확인했을 때 화면을 넘어가는 내용이 있으면 화면 하단에 '--More--(현재 위치/전체 분량)'의 형태로 알려준다.
스페이스바를 누르면 화면이 넘어간다
엔터를 누르면 한 줄씩 스크롤된다.
/문자열 을 누르면 해당 문자열을 찾아 이동한다.
q로 종료한다.
more 명령어는 이미 스크롤되어 지나간 내용을 볼 수 없다.
less 명령어는 파일 내용을 위아래로 스크롤할 수 있다.
j : 한 줄 아래로
k : 한 줄 위로
스페이스바 / ctrl + f(front) : 다음 화면으로
ctrl + b(back) : 이전 화면으로
tail [옵션] 파일명
옵션
+행번호
지정한 행부터 끝까지 출력
-숫자
화면에 출력할 행의 수를 지정(기본값은 10)
-f
파일 출력을 종료하지 않고 주기적으로 계속 출력한다.
ctrl + c로 빠져나온다
엔진엑스 로그 등의 변화를 관찰하기 좋다
파일을 다른 파일로 복사
두 번째 인자로 지정한 파일이 존재하지 않는 경우 원본 파일을 복사하여 새로 만든다.
두 번째 인자로 지정한 파일이 존재하는 파일이라면 원본 파일의 내용으로 덮어쓰고 원래 내용은 없어진다.
첫 번째 인자로 지정한 파일을 두 번째 인자로 지정한 디렉토리 안에 복사한다.
디렉토리는 미리 만들어져 있어야 한다.
(밑에서 살펴볼 디렉토리의 복사에서는 또 다르다)
파일을 복사하면서 파일명을 원본 파일과 다르게 지정하면 새로운 파일명으로 복사된다.
(ex : cp file1 directory/file2)
파일을 다른 디렉토리에 복사할 때는 해당 디렉토리에 대해 쓰기 권한이 있어야 한다.
(없으면 오류 발생)
cp 명령에서 인자를 3개 이상 지정할 수 있다.
이 경우에 마지막 인자는 반드시 디렉토리여야 한다.
마지막에 지정한 디렉토리 안에 앞서 지정한 인자들이 모두 복사된다.
-i옵션을 사용하면 두 번째 인자로 지정한 파일이 이미 있는 파일인 경우 덮어씌울 것인지 물어본다.
y로 대답하면 덮어씌우고, n라고 대답하면 복사하지 않는다.
디렉토리를 복사하려면 첫 번째 인자와 두 번째 인자에 모두 디렉토리를 지정하고 -r옵션을 사용하면 된다.
(앞서 본 것처럼 디렉토리의 복사도 인자를 여러 개 지정할 수 있다)
두 번째 인자로 지정한 목적지 디렉토리가 존재하지 않으면 두 번째 인자의 이름으로 새 디렉토리가 생성되며 안에 첫 번째 인자로 전달한 디렉토리의 모든 내용이 복사된다.
(앞에서 살펴본 파일 복사의 경우와 다르다. 대체 왜?)
두 번째 인자로 지정한 목적지 디렉토리가 존재하면, 첫 번째 인자로 전달한 디렉토리가 목적지 디렉토리 안에 복사된다.
(한 계층 내려간다)
파일을 다른 디렉토리로 이동하거나 파일명을 바꿀 때는 mv(move) 명령을 사용한다.
디렉토리를 이동하거나 디렉토리명을 바꿀 때도 mv 명령을 사용한다.
두 번째 인자로 지정한 파일이 이미 존재하는 파일이면 원본 파일의 내용으로 덮어쓰고 기존의 내용이 삭제된다.
두 번째 인자로 지정한 파일이 존재하지 않는 파일이라면 새 파일이 생성된다.
두 번째 인자로 디렉토리를 지정하는 경우 원본 파일을 지정한 디렉토리로 이동한다.
파일을 이동하면서 파일 이름을 바꾸려고 할 경우 아래와 같이 할 수 있다.
(ex : mv file1 directory/새로운 파일 이름)
역시 쓰기 권한이 없는 디렉토리에는 명령이 먹히지 않는다.
첫 번째 인자와 두 번째 인자 모두 디렉토리로 지정하면 디렉토리가 이동된다.
두 번째 인자가 존재하지 않는 디렉토리라면 디렉토리 이름이 변경된다.
rmdir과는 다르게 삭제할 디렉토리가 비어 있지 않아도 삭제할 수 있다.
-i옵션과 함께 사용할 수 있다.
이 경우 디렉토리의 하위 내용물 하나 하나에 대해서 삭제할 것인지 묻는다
만약 디렉토리의 하위 내용물을 전부 삭제하지 않았다면 디렉토리 자체는 삭제할 수 없다
하드 링크
기존 파일에 새로운 파일명을 추가로 생성하는 것
심볼릭 링크
원본 파일을 가리키는 새로운 파일을 만드는 것(윈도우의 바로가기)
리눅스에서는 파일이 '파일명 + inode + 데이터 블록'으로 구성된다.
파일명
사용자가 파일에 접근할 때 사용하는 파일의 이름
inode
파일에 대한 정보를 가지고 있는 특별한 구조체
외부적으로는 번호로 표시
내부적으로는 파일 상세 정보와 데이터 블록 주소 저장
ls -l로 출력되는 정보가 바로 inode에 저장된 파일 상세 정보
파일의 inode 번호는 ls -i 명령으로 확인 가능
파일명이 달라도 inode가 같다면 같은 파일이다.
리눅스에서는 파일에 여러 개의 이름을 붙일 수 있는데, 이때 붙이는 파일명을 하드 링크라고 한다.
하드 링크는 같은 파일에 이름만 다르게 붙이는 것이고, 복사는 완전히 독립적인 파일을 만드는 것이다.
사실 rm명령은 정확하게는 하드 링크 값을 하나씩 줄이는 것이다.
(하드링크의 개수가 0이 되면, inode와 데이터 블록의 데이터가 삭제되는 것)
심볼릭 링크의 inode번호는 원본 파일의 inode번호와 다르다.
ls -l로 확인해보면 파일의 종류가 l로 표시되고 파일명도 ->를 사용하여 원본 파일을 가리킨다.
심볼릭 링크와 하드 링크의 차이점
파일의 종류가 l로 표시된다.
하드 링크의 개수가 증가하지 않는다.
(원본 파일에 이름을 추가하는 것이 아니다)
파일명 뒤에 원본 파일명이 표시된다.
inode 번호가 원본 파일과 다르다.
(원본 파일과 심볼릭 링크 파일은 별개의 파일이다)
하드 링크는 같은 파일 시스템에 있는 파일에만 생성할 수 있는 반면, 심볼릭 링크는 다른 파일 시스템에 있는 파일에도 생성할 수 있다.
하드 링크는 데릭토레이는 생성할 수 없는 반면, 심볼릭 링크는 디렉토리에도 생성할 수 있다.
심볼릭 링크 파일의 크기는 바로 원본 파일 경로의 길이이다.
즉, 심볼릭 링크의 파일 내용은 원본 파일의 경로이다.
하지만, 심볼릭 링크 파일 내용을 출력하면 원본 파일의 경로가 출력되는 것이 아니라 원본 파일의 내용이 출력된다.
심볼릭 링크를 열고 수정하면 원본 파일이 수정된다.
당연하지만, 심볼릭 링크 생성 후 원본 파일을 삭제하면 심볼릭 링크로 원본 파일에 접근할 수 없다.
인자로 지정한 파일이 존재하지 않으면 내용이 없는 빈 파일을 생성하고, 파일이 존재하면 현재 시간 또는 옵션에 지정한 시간으로 파일의 관련 시간을 변경한다.
이미 있는 파일에 대해 touch 명령을 옵션 없이 사용하면 파일의 수정 시간이 현재 시간으로 바뀐다.
-t옵션을 사용하면 변경할 시간을 지정할 수 있다.
(다 나열하기 귀찮...)
grep은 파일 내에서 특정 문자열을 검색할 때 사용
정규 표현식을 이용하여 복잡한 검색도 가능하다
grep [찾고자 하는 문자열] 파일명
-n옵션을 이용하면 검색된 행의 번호도 함께 출력된다.
리눅스의 디렉토리 계층 구조에서 특정 파일이 어느 디렉토리에 있는지 찾는다.
파일의 생성 일자와 이름, 소유자 등 다양한 조건에 맞는 파일을 찾는다
옵션 너무 많다...
whereis나 which 명령은 특정 명령이 있는 위치를 찾아서 절대 경로를 출력한다.
whereis
지정한 명령을 고정된 특정 경로에서 검색
환경 변수 $PATH와 $MANPATH에 지정된 디렉토리를 검색하여 파일의 위치를 찾는다.
which
에일리어스나 PATH 환경 변수로 지정된 경로에서 파일을 찾는다.
사용자 초기화 파일에 지정된 에일리어스를 먼저 찾아보기 때문에 에일리어스가 지정된 명령의 경우에는 해당 에일리어스가 출력된다.
에일리어스가 없으면 PATH 환경 변수에 지정된 경로를 순서대로 찾아가며 명령어 파일이 있는지 검색한다.
파일을 찾으면 절대 경로를 출력하고 바로 종료한다.
(최대 하나의 경로만을 출력하며, 이 경로는 우리가 명령을 입력할 때 실행되는 파일이다)
홈 디렉토리에서 파일명이 data1.cp인 파일을 찾아 temp 디렉토리로 이동한다.
find ~ -name data1.cp -exec mv {} temp \;