리눅스에서 파일을 저장하고 다루는 방식은 일반적인 컴퓨터 환경인 Windows에서와 크게 다르다.
다만 Windows에서는 불가능하거나 활용하기 어려운 많은 기능들을 더 쉽게 살려낼 수 있어
더욱 강력한 파일 활용이 가능하다.
모든 파일들이 C 드라이브 아니면 D 드라이브 내에 저장되는 윈도우와 달리,
리눅스에는 C 드라이브, D 드라이브 등이 아예 없다.
파일이 저장되는 장소부터 완전히 다르다.
모든 파일은 /
바로 이 슬래쉬라는 장소 아래에 저장된다.
이 슬래쉬는 root
라고 부른다. (말그대로 “근본”이다.)
하지만 여기에 저장된 파일들이 사실 모두 정상적인 파일은 아니다.
윈도우는 파일이라고 하면 워드 파일, 파워포인트 파일 등 진짜 데이터가 담긴 파일들 뿐이지만
리눅스에서는 정말 데이터가 담긴 파일이 아닌 것들도 파일로 취급한다.
(이상 자세한 설명은 리눅스 시스템의 깊은 곳으로 들어가므로 생략한다)
또한 이렇게 모든 파일들이 루트
한 곳 아래 몰려 있는데
한 컴퓨터에서 여러 사람이 동시에 사용할 수 있게 하려다 보니
파일 각각에 누가 만들었는지, 누가 어떻게 사용 가능한지를 기록하게 되었다.
이것이 파일 권한이다.
위 사진은 파일 목록을 확인한 것이다.
목록 맨 앞줄 drwxrwxrwx
, 그 뒤 root root
가 여기에 해당하는 것이다.
알파벳 | 권한 | 값 | 기능 |
---|---|---|---|
r | Read(읽기) | 4 | 파일/폴더의 내용을 읽음 |
w | Write(쓰기) | 2 | 파일/폴더를 수정하거나 삭제함 |
x | eXecute(실행) | 1 | 파일을 실행하거나 폴더 내 내용물을 확인함1) |
윈도우와 달리 리눅스는 파일마다 이렇게 권한 설정이 되어있고,
내가 만든 파일이라도 권한이 누락되어있을 경우 나조차 사용할 수 없다.
drwxrwxrwx
한 글자씩 그 의미를 따져보면,
d | r | w | x | r | w | x | r | w | x |
---|---|---|---|---|---|---|---|---|---|
d =폴더, - =파일 | 읽기 | 쓰기 | 실행 | 읽기 | 쓰기 | 실행 | 읽기 | 쓰기 | 실행 |
Read | Write | eXecute | Read | Write | eXecute | Read | Write | eXecute | |
4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |
소유자 | 소유자 그룹 | 외부인 |
하이픈(-
)표시가 되어있는 것이 바로 그 누락된 권한이다. 즉, 위 사진에서 rwxr-xr-x
는
- 소유자는 읽고 수정하고 실행 가능(rwx
)
- 소유자 그룹에 속한 유저는 읽고 실행 가능(r-x
) (수정w
불가)
- 외부인은 읽고 실행 가능(r-x
)
여기서 위 사진에서와 같이 파일을 ls -alh
로 모두 표시해보았을 때 root root
라고 뜨는 것이 각각 소유자=root
와 소유자 그룹=root
ㄹㄴㅇㅁㄹㅈ 를 확인한 것입니다.
이런 방식대로 하면 “이 파일은 실행할 수 있는거야”를 명시적으로 표시할 수 있을 뿐더러
지정된 일부 유저 외 나머지는 접근을 제한하는 보안(보호) 조치를 겸하게 된다.
다음 경우에서 test.sh
와 test2.sh
는 실행 가능한 내용이 들어있는 같은 내용의 파일이지만
test.sh
는 x권한이 있는 반면 test2.sh
는 없다. 이 경우 각각을 실행했을 때,
이와 같이 test.sh
는 정상적으로 실행되지만 test2.sh
는 Permission denied
, 즉 권한 부족 오류가 발생한다.
만약 이 상황에서 사용하려 하는 파일이 test2.sh
였다면 다음 명령을 이용한다.
chmod 권한 (설정할 파일/폴더) chmod +x test2.sh # x권한을 추가(+)한다 chmod 755 test2.sh # 권한값을 변경한다여기서
+x
는 x
권한을 파일에 추가한다는 의미로, x
(실행) 권한을 추가한다는 의미다.+r
, +w
등으로 사용하면 된다.755
는 권한을 추가/제거가 아니라 직접 통째로 설정하는 것으로, 위 표에서 “값”을 이용한다.r
, w
, x
권한이 모두 필요한 경우 4+2+1 = 7이고,x
권한을 제외한 r
, w
권한만 필요하면 4+2+0 = 6이 되는 식이다.리눅스 배포판에 따라 차이가 있다. 이 문서에서는 가장 널리 사용되는 Ubuntu 배포판을 기준으로 설명한다.
화면을 오래 써서 지저분하고 정신없다면
clear를 눌러 청소할 수 있다.
명령어를 입력하는 곳에서 상/하 방향키를 누르면 이전에 입력한 명령어 목록을 탐색할 수 있다.
위로 올라갈수록 옛날, 아래로 내려올수록 최근 사용한 명령어이고
맨 마지막은 현재 입력하고 있는 명령어, 즉 (아무것도 입력하지 않았던 상태라면) 빈칸이다.
ROS 프로그래밍 등 리눅스를 사용한 작업을 하다보면 모니터를 통한 그래픽 환경보다는 SSH 등을 통한 터미널 환경을 더 자주 접하게 된다.
리눅스는 라즈베리파이와 같은 초저사양 환경이나 머신러닝 학습 등 (극)고사양 장치의 성능을 극한으로 사용해야 할 때 주로 사용하는데,
그래픽 환경은 장치의 리소스를 많이 잡아먹기도 하고, 모니터가 반드시 필요한 탓에 제약사항이 많아 터미널 환경을 쓰게 되는 것이다.
그래서 리눅스가 설치된 장치에서 마우스 없이 작업파일을 직접 처리해야 할 때가 자주 있다.
또한, 일일이 작업하기 어려울 정도로 대량의 반복되는 작업을 “쉘 스크립트”로 자동화한다던지,
그래픽 환경이 제공되지 않는 프로그램을 사용해야 하는 경우에
파일을 조작하는 기초적인 명령어를 알고 있으면 큰 도움이 되므로 잘 알아두자.
현재 작업중인 위치에 있는 파일과 폴더 목록(list)을 표시한다. List를 줄여 ls
가 되었다.
아무런 부가 옵션 없이 ls
만 실행하면 파일 명만 나오는데,
ls -alh이렇게 하이픈(
-
)뒤에 알파벳으로 옵션을 주면(각 글자별로 의미가 있음) 좀 더 자세한 파일 정보가 포함된 파일 목록을 볼 수 있다. 여기서
옵션 | 기능 |
---|---|
a | 숨겨진 파일(파일명이 . 으로 시작하는 파일들)까지 보기 |
l | 자세한 목록(파일 크기, 만들어진 날짜, 권한 등) 보기 |
h | 파일 크기를 몇 바이트가 아니라, 사람(h uman)이 읽을 수 있는 단위를 붙여 보기 |
R | 현재 위치에 하위 폴더가 있다면, 그 폴더 안에있는 파일까지 모두 표시. |
아래 명령어들은 각각 같다.
la # ls -a 와 동일한 명령
ll # ls -l 과 동일한 명령
touch 파일명현재 작업중인 위치에 크기가 0인, 아무 내용 없는 빈 파일을 만든다. 이 때
touch /전체/경로/파일명이렇게 전체 경로를 다 포함하면, 현재 작업 중인 위치에 관계 없이 지정된 경로에 주어진 파일명으로 빈 파일을 만든다. 이 때, 파일명 앞
/전체/경로/
라는 폴더가 모두 존재해야 한다. 즉, /전체
폴더가 없거나 /전체
는 있는데 /전체/경로
가 없으면 안된다.
Make Directory를 줄여 mkdir
이 되었다.
mkdir 폴더명 mkdir -p /전체/경로/폴더명현재 작업중인 위치에 크기가 0인, 아무 내용 없는 빈 파일을 만든다. 여기서
-p
는, /전체/경로/
이라는 2 단계의 경로가 존재하는지에 관계없이 폴더명
폴더를 만든다.
-p
없이 실행할 경우 touch
명령과 마찬가지로, 폴더를 만드려는 곳인 /전체/경로/
가 존재하지 않으므로 명령이 실행되지 않는다.
Copy를 줄여 cp
가 되었다.
cp 원본파일 새파일
Move를 줄여 mv
가 되었다.
mv 기존파일(폴더) 새파일(폴더)파일(폴더)의 위치와 이름을 바꾼다. 사용법이 매우 다양해 실제 예를 통해 알아보자.
mv memo.txt note.txt mv folder directory
memo.txt
파일을 위치 이동 없이 이름만 note.txt
로 바꾸었다.
folder
라는 폴더(또는 파일일수도)를 위치 이동 없이 이름만 directory
로 바꾸었다.
mv /home/kasimov/memo.txt /home/kasimov/note.txt
/home/kasimov
라는 폴더 내에 있는 memo.txt
파일을 위치 이동 없이 이름만 note.txt
로 바꾸었다. 현재 작업공간이 /home/kasimov
가 아니어도 작동한다.
mv /home/kasimov/memo.txt /home/kasimov/note/새파일(폴더) 이름을 적는 대신 어떤 폴더를 적으면 그 폴더에 집어넣게 된다(맨 마지막의 슬래쉬
/
는 적지 않아도 무방). 이 때 파일(폴더)명 자체는 유지된다(위 사례처럼 파일 이름이 바뀌는 것이 아니다.)
위 두 경우를 동시에 사용하면, 위치 이동과 이름 변경을 동시에 할 수 있다.
mv /home/kasimov/test1/memo.txt /home/kasimov/test2/note.txt
test1
폴더에 있던 memo.txt
파일을 test2
폴더에 옮김과 동시에 note.txt
라는 이름으로 바꾸었다.