부모 디렉토리가 존재하지 않을 경우 당연한 말일 수 있으나 그 아래 하위 디렉토리를 만들 수 없다.
부모 디렉토리가 없더라도 한번에 부모와 자식 디렉토리를 한번에 만들어 줄 수 있다 (mkdir -p)
삭제 할 때에도 하위 디렉토리가 있다면 삭제가 불가능 하다. 한번에 지우기 위해서는 (rmdir -p) 명령어가 필요하다.
mkdir <dir_name>
#make directory
mkdir -p <pDir_name>/<subDir_name>
#make directory + parents
#부모 + 자식 디렉토리 한번에 생성
rmdir <dir_name>
#remove directory
rmdir -p <pDir_name>/<subDir_name>
#remove directory + parents
#부모 + 자식 디렉토리 한번에 삭제
rm -r <dir_name>
#remove + recursive
#r(recursive) 옵션을 통해 재귀적으로 삭제가 가능
#recursive 명령어를 사용하여 지우게 되면 아래 sub 디렉토리+파일을 포함하여 모든 삭제 작업을 수행.
#**사용자의 주의**가 필요하다.
디렉토리 이동
cd <dir_name>
#change directory
cd -
#이전 디렉토리로 이동
cd .
# . (현재 위치의 디렉토리)
cd ..
# .. 상위(부모) 디렉토리
cd ~
# 사용자의 홈 디렉토리
파일 명령어 살펴보기
윈도우에서는 우클릭해서 "새로 만들기"를 했을 것이다.
파일들을 일괄적으로 작업을하거나 관리하고 싶을 수 있는데 이 부분을 마우스 우클릭을 여러번 하게 되면 불편할 것이다.
윈도우 파일들의 우클릭하여 속성을 보면 , 알려진 파일의 확장자를 숨기거나 숨긴 파일들 도 있었을 테고 , 시스템 관련 파일이나 중요 파일을 숨기는 기능도 있었다.
리눅스에서는 어떻게 구현이 되어 있는지 확인해 보자.
앞서 윈도우 커맨드 창의 cmd 창에서의 파일 확장자를 변경하는 명령어를 확인해보자
ren *.txt *.ppt
윈도우의 파일에 직접 우클릭하여 rename을 하지 않고 일괄 처리를 한번에 명령어를 통해 할 수 있는 것을 알 수 있다.
반복적으로 누군가 매일 수행해야한다고 하면 , 당연히 커맨드라인이 훨씬 더 편하고 효율적인 자동화 도구를 만들 수 있는 방법이 될 것이다.
파일 보기
ls [option]... <file>...
히든 파일 : 윈도우처럼 별도 파일의 속성을 통해 히든 파일이 제어되는 것이 아닌 , 파일명의 맨앞에 영문자나 숫자가 아닌 . 으로 시작하게 되면 히든파일에 대한 명령이 된다.
이 경우 ls -a (또는 ll) 의 명령어를 통해 전체보기를 할때만 보여지게 된다.
ls
#list
#현재위치의 디렉토리 파일 및 디렉토리 목록 표시
ls -l
#list + long
#파일 상세 정보 포함하여 표시
ls -a
#list + all
# 숨김 파일(.으로 시작하는 파일) 표시
ls -a -l
#list + all + long
# 숨김 파일(.으로 시작하는 파일) 포함하여 리스트 표시
ls -al
#list + all + long
# 위의 명령어를 풀면 이런식이고 , 위와 같이 합칠 수 있다.
ls -ali
#list + all + inode(Link)
#파일 링크 까지 확인.(+ inode)
ls *.txt
#"확장자가 .txt 파일인 것을 보여줘"
inode : 리눅스에서 파일을 관리하는 구조체 파일이라는 것은 파일의 실제 데이터를 가르키고 있는 포인터의 역할. 사실 이 사이에는 inode 라는 것을 거쳐서 연결이 된다.
파일 내용 보기
cat [option]... <file>...
#concatenate : 연결하다
cat 이라는 명령어는 파일을 보여주는 것에 그치는 것이 아니라 다양한 능력을 보유하고 있음.
concatenate 라는 단어 파생으로 본다면 , 단지 show에 그치는 것이 아닌 무언가를 연결하다라는 뜻을 가짐.
입력값으로 파일을 받고 → standard out 이라고 부르는 out과의 연결하는 역할을 보여준다.
파일의 내용을 합치는 것 또한 cat 명령어를 통하게 된다.
즉input(file) 과 output(standard out)의 연결
more [option]... <file>...
#more : 더 많이
#파일 내용을 한 화면씩 출력
파일이나 명령 출력의 내용을 한번에 화면에 표시하고 , 사용자가더 많은내용을 보고 싶을때 스크롤 할 수 있게 설계.
너무 많은 내용을 출력하게 될 때 , 마우스 스크롤을 사용해야 하는 번거로움에서 발생되었다.
긴 내용을 조금 더 손쉽게 네비게이션 하고 탐색하는 명령어.
파일 내용 보여주기 ( 페이지 단위 이동 - space , 줄 단위 이동 - enter)
단점으로는 다음 페이지만 보기 가능하고 이전페이지로 돌아 갈 수 없다.
그 단점을 보완하기 위해 나온 도구가 less.
less [option]... <file>...
#파일 내용을 스크롤하면서 보기
less : 더 적은 →왜 이런 의미가 파생되었을까 ? 역설적 유머를 통해 나오게 된 파생어 ."Less is more(적은 것이 더 많다)"
more 보다 향상된 기능이고 , more 처럼 모든 파일을 메모리에 올리지 않기 때문에more 대비 속도가 빠르다. (more는 용량 큰 파일을 볼때 초기 로딩 속도가 다소 느린 단점이 있었다. less 는 보여지는 만큼 파일의 내용을 분할하여 메모리에 올린다.)
( 페이지 단위 이동 - space , 줄 단위 이동 - enter, 방향키 상하좌우 - 페이지 up/down)
cat -e
#concatenate + end
#파일 내용의 줄 맨 뒤에 $ 붙이기(텍스트의 빈공백 , 히든 캐릭터 공백 확인용)
cat -n
#concatenate + number
#각 파일 내용의 줄의 번호를 보여줌
파일 만들기 / 지우기
touch [option]... <file>...
touch : 파일을 툭 건들인다. → 정확히는 파일 생성보다는 현재 시간(time_stamp)으로 바꾸기.
→ 해당 파일이존재하지 않는다면 , 0바이트의 파일이 생성되는것. (확장자가 있어도 무방하고 없어도 무방함.)
rm [option]... <file>...
remove : 삭제 → 파일 또는 디렉토리 삭제
강제로 지우려고 하더라도 , 지울 수 없는 것을 확인할 수 있다.
허가 : 권한이라는것이 존재하는 구나 . 알 수 있겠다.
파일 복사
cp [option].... <src> [dst]
즉 destination (목적지) 에 디렉토리가 존재하지 않을 경우 그 파일명으로 복사되는 것이고 ,
디렉토리 명이 존재하게 된다면 그 디렉토리 안에 같은 파일명으로 복사되는 것이다.
만약 동일한 파일명이 존재한다면 덮어 쓰게 되므로 주의가 필요하다.
cp <원본> <새로운 카피본 이름>
#(=> copy) 파일 복사
cp <원본> <디렉토리>
#해당 파일을 디렉토리 안으로 복사
cp -r <원본 디렉토리> <새로운 디렉토리 명>
#(=> copy + recursive) 대상 디렉토리의 내부를
#디렉토리 + 파일을 포함하여 재귀적으로 새로운 디렉토리에 복사
파일의 이동
대상의 디렉토리명이 없을 경우 이름이 변경되고 (rename 명령어가 별도로 있기는 하나 이런식의 방법도 가능.),
디렉토리명이 있을 경우 대상 디렉토리로 이동이 된다.
mv <원본> <대상>
#( => move) 파일 이동 또는 이름 변경
파일의 링크
ln <option>... <target> <linkname>
윈도우의 우클릭 → 바로가기 만들기의 기능과 유사한 링크 만드는 명령어다.
ln의 명령어는 두가지의 기능을 수행한다. 1. 하드링크 2. 소프트 링크
소프트 링크는 symbolic link ( 윈도우의 바로가기 만들기 기능) 과 동일한 기능을 수행 (ln -s)
하드 링크는 파일이 복사 된것 처럼 같은 파일이 두개 생기는 것을 확인할 수있다 (ln) (ls -als 명령어를 통해 확인 가능)
파일 명이란 그 파일의 내용을 갖고 있는 것이 아닌 해당 파일의 위치를 나타내는 포인터의 역할을 하게 된다.
하드 링크라는 것은 보는 바와 같이 , 해당 파일을 가르키는 포인터만 하나 더 만들게 되는 것이다. 즉 , 같은 파일을 바라보는 것이라고 할 수있다.
10M 파일을 만들어서 ln 명령어를 통해 하드링크를 생성했다면 우리눈에는 10M 파일이 두개 생성된 것처럼 보이나 , 실제 하드디스크 상의 공간은 10M만 차지하게 된다.
하드링크를 만들게 되면 누가 원본이고 사본이냐에 대한 개념이 사실상 사라지게 되는 것이다. 두 파일 모두 해당 파일에 대한 데이터를 가르키고 있는 포인터에 불과하기 때문이다.
이에 반해 소픝트 링크는 직접적으로 바라보는 포인터가 아닌 그 포인터를 가르키는 포인터가 만들어 지게 되는 것이다.
실제 용량도 파일에 해당하는 용량 + symbolic link 바이트로 표시하게 된다.
심링크는 윈도우의 바로가기와 매우 유사한 기능을 가지고 있고 , 상당히 많이 사용되는 편이다.
하드링크는 사용사례가 많지 않다. 사용된다면 사용사례로 백업을 들 수 있다.
하드 링크를 만들게 되면 파일 포인터가 하나의 inode 를 포인팅 하는 것.
inode 가 실제 데이터 값을 가르키는 주도값을 가지게 된다.
심링크는 그에 반해 다른 inode를 만들고 그 inode 가 해당 파일의 포인터를 가르키는 구조로 되어있다.
이 inode안에는 다양한 파일의 속성값을 가지고 있고 , 권한또는 사이즈 , 수정시간 등 여러가지 정보를 가지고 있다.
ln <원본_파일> <링크_이름>
#하드링크 생성
ln -s <원본_파일> <링크_이름>
#심볼릭 링크(바로가기) 생성 , 심링크라고 부름
파일의 속성 보기
file [option]... <file>...
파일이 비었는지 , 또는 유형은 어떤 유형인지 영문자와 숫자로 이루어진 텍스트 형태의 파일인지(ASCII text) 디렉토리파일인지 바이너리 형태 파일이라던지 파일의 정보를 알 수 있는 명령어이다.
파일 편집기
GUI 없이 파일내용을 편집할 수 있도록 제공하는 기능.
vi는 가장 오래된 편집기 중 하나로 기본 텍스트 편집기로 사용된다. 단점으로는 익숙해지기전까지는 다소 사용범이 어렵다는 단점.
vi 가발전하여 vim 이라는 것이 가장 일반적으로 많이 사용된다. 코드 작성과 편집에 적합하며 , 다양한 플러그인 지원하는 에디터. 사용법은 vi와 동일하고 추가기능 을 사용케 한다.
vim 에 익숙하지 않는다면 nano라는 에디터도 있다.
직관적인 ui와 단축키로 인해 초보자에게 친숙한 텍스트 편집기로 명령모드가 없어 사용이 편리할 수있다. 간단한 파일 편집에 적합하다.