
우분투 설치 시 기본적으로 파일 시스템에 시스템 디렉터리가 생성된다. 시스템 디렉터리는 중요한 의미를 갖기 때문에 함부로 삭제하거나 변경해서는 안된다.
루트 디렉터리 조회 시 시스템 디렉터리 목록을 확인할 수 있다.

/ : 모든 디렉터리가 시작하는 뿌리인 최상위 디렉터리. 루트로 읽는다./boot : 부팅에 필요한 커널, 초기화 이미지, 부트로더 관련 파일/dev : 시스템에 설치된 장치(마우스, 모니터, 그래픽카드, 저장장치) 파일/etc : 사용자/그룹정보, 파일 시스템테이블, 네트워크 설정파일 등 시스템 설정 파일/bin : 사용자가 사용하는 가장 기본적인 명령들의 실행 파일/lib : 공유 라이브러리 파일. 시스템 부팅과 응용 프로그램 실행에 필요/home : 사용자 계정 별 홈 디렉터리. 사용자 계정 생성 시 사용자 계정 이름과 동일한 홈 디렉터리가 이 경로 아래에 생성된다. 사용자는 각자의 파일을 사용자 홈 디렉터리에 저장한다./root : 루트 계정을 위한 홈 디렉터리. 일반 사용자는 접근하지 못하도록 권한 설정이 되어있다./sbin : 루트 권한이 필요한 시스템 관리 명령/tmp : 임시로 파일을 생성/삭제하는 공간. 주로 사용자 프로그램에서 임시로 읽어들여야하는 입출력 파일들을 저장하는 데 사용/var : 시스템 운영 중 발생하는 임시 파일(시스템 로그, 웹사이트 콘텐츠, 전자메일 등) 보관. 크기가 계속 변하는 파일을 저장한다./usr : 사용자가 추가로 설치한 응용 프로그램 파일 저장/proc : 시스템 정보 제공. 리눅스 커널과 통신하는 가상 파일 시스템 디렉터리로 실제 공간을 차지하지는 않는다. CPU 정보, 인터럽트 목록, 입출력 주소 목록 등 커널이 제공하는 정보가 파일 형태로 저장/opt : 외부에서 제공되는 패키지가 설치pwd : 현재 작업중인 디렉터리 위치를 화면에 표시
mkdir : 디렉터리 생성
-p(--parent) 옵션을 활용하면 상위 디렉터리를 포함하는 하위 디렉터리를 생성한다.
예를 들어, 현재 작업 디렉터리에 BaseballTeam이라는 디렉터리를 만들고, 다시 그 아래 KBO라는 디렉터리를 생성하려면 mkdir을 두 번 실행해야 하지만, -p 옵션으로 한 번에 생성 가능하다. 옵션 없이 실행하면 오류가 발생하니 주의하자.

cd : 디렉터리 이동cd [옵션][디렉터리] 형식으로 작성한다.

ls -al로 확인 가능한 숨김 폴더 중 . 는 현재 디렉터리, .. 는 현재 디렉터리의 상위 디렉터리를 의미한다.

cd ..를 입력하면 상위 디렉터리로 이동한다.

cd 명령 실행 중 대상 디렉터리를 입력하지 않거나 틸트(~)를 입력하면 해당 사용자 계정의 홈 디렉터리로 바로 이동한다.

상대 경로와 절대 경로를 이용한 이동
📍
pwd명령은 항상 현재 디렉터리를 절대 경로로 표시한다.
- 상대 경로 : 특정 디렉터리를 기준으로 디렉터리 경로를 지정
mkdir명령으로 사용자 홈 디렉터리 아래에 BasketballTeam/NBA 를 생성 후 상대 경로로 이동해보자.
상대 경로로 최하위 디렉터리 NBA까지 이동하려면 하위 디렉터리 경로만 입력하면 된다.
- 절대 경로 : 최상위 디렉터리인 루트 디렉터리를 기준으로 디렉터리 경로를 지정
다시 홈으로 돌아와 절대 경로로 이동해보자. 절대 경로로 이동 시 모든 경로를 입력해야 한다는 불편함이 있다.
하지만 다음처럼 BasketballTeam/NBA에서 BaseballTeam/KBO로 이동하는것과 같은 상황에서는 절대경로로 이동하는 편이 낫다. 상대 경로로 이동 시 반드시 상위 경로인 사용자 홈 디렉터리를 거쳐야 하기 때문이다.
- 상대경로로 이동한 경우
- 절대경로로 이동한 경우
rmdir : 디렉터리 삭제앞서 만들어둔 빈 디렉터리를 삭제해보자. rmdir은 빈 디렉터리만 삭제하므로, 디렉터리에 파일이 있다면 rm 명령을 사용해야 한다.

cp [옵션] [원본파일] [사본파일] : 파일 복사테스트를 위해 현재 디렉터리에 touch 명령으로 teamdata라는 빈 파일을 만들어 해당 파일을 복사해보자.

원본(teamdata)와 사본(lions)의 권한, 소유권, 변경 시각이 동일하다.
원본 또는 사본의 경로를 구체적 지정도 가능하다.
아래 명령은 teamdata의 파일을 BaseballTeam/KBO에 twins라는 파일명으로 복사한다.

-r(--recursive) : 하위 디렉터리에 존재하는 디렉터리와 파일 모두를 복사-a(--archive) : 파일 복사 과정에서 접근 권한, 소유자, 그룹, 파일 수정시간 정보를 그대로 보존아래 명령은 KBO 디렉터리를 MLB 디렉터리로 복사하며 하위 디렉터리의 접근권한, 소유권, 변경시각을 그대로 유지한다.

mv [옵션] [원본파일] [사본파일] : 파일 이동mv 명령어는 cp 명령어와 다르게 원본 파일이 삭제되므로 주의해야한다.
아까 생성한 lions 파일을 BaseballTeam/KBO로 옮겨보면 기존 경로에서는 삭제되었고 지정한 경로에 파일이 생성됨을 확인할 수 있다.

원본 파일을 여러개 옮기는 것도 가능하다. KBO 디렉터리에서 MLB 디렉터리로 두 파일을 한 번에 이동시켜보자.

mv 명령어로 디렉터리도 옮길 수 있다.
MLB 디렉터리를 MajorLeagueBaseball로 옮겨보자.

rm [옵션] [파일명] : 파일 삭제touch 명령어로 빈 파일을 여러개 생성할 수 도 있다.

rm 명령어로 파일을 삭제한다. 동시에 여러 파일을 삭제할 수도 있다.

-rf 옵션을 붙이면 하위 디렉터리를 포함한 모든 파일을 삭제할 수 있다.
-r : 재귀 옵션. 하위 디렉터리에 영향을 미친다.-f : 삭제하려는 파일이 있는지 확인하지 않고 강제로 삭제한다.이 때, 대상 파일을 삭제할 권한이 없다면 오류 메시지가 나타난다. rm -rf 명령을 실행하기 전에는 반드시 삭제 대상과 권한을 확인해야한다.
특히, 루트 디렉터리를 대상으로 삭제 명령을 실행한다면 시스템 파일들이 순식간에 제거되어 복구 불가능한 상태가 되므로, 삭제 대상 파일의 권한 때문에 sudo 명령으로 루트 권한을 얻어야 한다면 rm 명령을 실행하기 전 다시 한 번 삭제 대상을 확인해야 한다.

cat : 파일 내용 화면에 표시cat 명령은 파일의 내용을 조회한다. /usr/share/common-licenses/GPL 파일을 조회해보자. 이 파일은 리눅스 커널에 적용된 GPL 라이선스 정보이다.

-n(--number) : 줄번호 추가

> : 출력 재지정. 출력 결과를 화면 대신 파일로 보내 새로운 파일을 생성할 수 있다.
cat > [파일명] 을 실행하면 빈 줄이 나오고 여기에 파일 내용을 입력한 후 ctrl + d를 눌러 종료하면 다시 명령행으로 나간다.

내용을 다시 조회해보면 위에서 입력한 내용이 정상 저장됨을 확인할 수 있다.

입출력 재지정
리눅스의 표준 입력 장치는 키보드, 표준 출력 장치는 모니터 화면이다.
>또는<로 표준 입력 및 출력을 다른 대상으로 바꿀 수 있다. 배시가 제공하는 입출력 재지정 기능이다.
- 출력 재지정
>
출력 재지정 기호를 이용해ls명령의 결과를 표준 출력 장치인 모니터가 아닌 homelist 파일로 출력한다. homelist 파일에는ls명령 결과인 홈 디렉터리의 파일 목록이 저장되어 있다. 이 때, 해당 파일이 존재하지 않는다면 자동 생성하여 표기한다.
- 입력 재지정
<
입력 재지정 기호를 이용하면 표준 입력 장치인 키보드 입력 대신 파일에서 입력받아 처리할 수 있다.
sort는 결과를 순서대로 정렬하는 명령인데,-r옵션을 활용하면 결과를 역으로 정렬할 수 있다.
표준 입력을 재지정하여 앞서 만든 homelist 파일의 내용을sort명령으로 넘긴다. 명령 결과 파일 목록을 알파벳 역순으로 정렬하여 화면에 표시한다.
more, less : 한 화면씩 스크롤하여 파일 내용 조회cat 은 파일 내용을 끝까지 한 번에 다 보여주기 때문에 화면에 표시할 내용이 많다면 모두 확인하기는 어렵다. 분량이 많은 파일은 more나 less로 한 화면씩 스크롤 하는 편이 낫다.
| 키 | 동작 |
|---|---|
| space 바, f | 다음 화면 |
| b | 이전 화면 |
| enter | 한 줄씩 표기 |
| q | 화면을 종료하고 명령행으로 복귀 |
아까 열었던 GPL 파일을 more 명령으로 호출해보자. 화면 아래에 표시되는 정보로 스크롤의 위치를 가늠할 수 있다.

less를 활용해도 동일한 키로 파일 내용을 조회할 수 있다. less 명령어는 more 명령어보다 더 많은 키를 활용할 수 있다.
| 키 | 동작 |
|---|---|
| g | 첫 화면으로 이동 |
| G (shift + g) | 마지막 화면으로 이동 |
| / | 문자열 검색 ex) /GNU 명령어 실행 시 해당 단어가 하이라이트 된다. 이 때, n과 N(shift+n)을 눌러 검색된 문자열을 건너뛰며 이동할 수 있다. |

head, tail : 파일의 처음(head) 또는 미지막(tail)을 기준으로 파일 내용 출력/var/log/syslog는 시스템이 남기는 로그 파일로 운영 과정에서 발생하는 이벤트 기록을 저장한다. 일반적으로 로그 파일은 용량이 크고 내용이 자주 바뀌므로 일부만 모니터링하는 것이 유용하다.
head : 파일의 처음을 기준으로 파일 출력특별히 옵션을 사용하지 않으면 파일의 첫번째 줄 부터 열번째 줄 까지 출력한다.

특정 줄까지 출력하고 싶다면 -n(--lines) 옵션을 사용한다. 다음 명령어는 처음부터 15번째 줄까지 출력한다.

tail : 파일의 마지막을 기준으로 파일 출력head와 마찬가지로 옵션을 지정하지 않으면 파일의 마지막 줄 부터 열번째 줄 까지 출력하며, -n 옵션을 추가해 보고싶은 줄의 범위를 지정할 수 있다.

-f(--follow) 옵션은 실시간으로 파일을 모니터링 한다. 명령을 실행하면 명령 프롬프트를 반환하지 않고 지속적으로 시스템이 변하는 상황을 보여주며, ctrl+c를 누르면 명령행으로 되돌아온다.

find [탐색경로] [옵션] [표현식] : 파일 찾기탐색 경로를 생략하면 현재 작업 중인 디렉터리부터 검색을 시작한다.
이 때, 읽기 권한이 없는 디렉터리는 검색을 건너뛴다. sudo로 루트 권한을 얻으면 모든 디렉터리를 대상으로 검색할 수 있는데, 루트 디렉터리부터 시작해서 모든 파일을 검색하려면 탐색 경로에 루트 디렉터리를 명시한다.
다만, 파일 시스템 전체의 파일을 검색하므로 시간이 오래걸린다.
| 옵션 | 기능 |
|---|---|
-name | 파일 이름으로 검색 |
-perm | 파일 권한 대상으로 검색 |
-type | 파일 종류를 대상으로 검색 |
-size | 파일 크기를 대상으로 검색 |
-links | 링크 수를 댓아으로 검색 |
-user | 사용자 ID를 대상으로 검색 |
-atime, -mtime, -ctime | 특정 기간동안 접근, 수정, 변경된 파일을 검색-atime : 파일 접근 시간-mtime : 파일 내용 변경 시간-ctime : 파일 속성 변경 시간 |
-maxdepth | 탐색할 디렉터리 깊이 제한 |
-i | 대소문자 구분 없이 검색 |
-name : 파일 명으로 검색

-type : 파일 종류를 지정하여 검색
다음 명령어에서 d는 디렉터리를 의미한다.

-mtime : 특정 기간 동안 내용이 변경된 파일 검색
인자로 변경된 기간을 받는데, -는 미만, +는 초과를 의미한다.
예를 들어, -mtime +7은 수정한지 일주일이 넘은 파일들을 대상으로 한다.
아래 명령어는 현재 디렉터리(.)를 기준으로 수정한지 하루가 되지 않은(-mtime -1) 파일들을 검색한다.

검색 옵션 중복 사용
상위 디렉터리(..)부터 100MB가 넘는(-size +100M) 일반 파일(-type f)을 검색

루트 디렉터리(/)부터 시작해서 두 단계의 하위 디렉터리(-maxdepth 2)까지 bin이란 이름을 가진(-name bin) 파일 또는 디렉터리를 검색
검색 결과 /bin, /usr/bin은 포함하지만 /usr/local/bin은 제외함을 볼 수 있다.

/etc 디렉터리에서 대소문자 구분 없이(-i) conf로 끝나는(-name *conf) 파일(-type f)을 검색

파일 명을 대체하는 메타문자
*: 모든 문자 대체.find -name a*b형태로 사용
ex) a*b : a로 시작하여 b로 끝나는 모든 이름. aannbb, anb 등 모두 조회
?: 정확히 1개의 문자만 대체.find -name a?b형태로 사용
ex) a?b : a로 시작하고 중간에 임의의 문자 하나가 있으며 b로 끝나는 이름. anb 형태만 조회, aannbb는 조회 불가
[문자]: 괄호 안에 있는 문자를 대체.find -name [A,B,C]_number형태로 사용
ex) [A,B,C]_number : A나 B또는 C로 시작하고 _number로 끝나는 파일 이름. A_number, B_number, C_number가 검색됨
이 케이스는 표준식처럼-를 이용해 대체할 영문자나 숫자의 범위를 지정할 수 있다. 예를 들어, number[0-9]는 number로 시작해서 0부터 9까지 숫자가 붙는 문자인 number0, number1, ... number9에 대응한다.
같은 원리로 [A-C]number는 [A,B,C]number와 동일한 검색 결과를 도출한다.
다만 이 경우, 범위를 지정할 때 a-Z처럼 대/소문자를 섞어쓰거나 숫자와 영문자를 섞어 범위를 지정할 수 없다. [] 안에는 동일한 성질의 문자 범위만 지정할 수 있다.
echo : PATH 내용 확인명령 행에서 명령을 입력하면 셸은 환경변수 PATH에 정의된 디렉터리들을 검색하여 실행한다. 각 디렉터리는 콜론(:)으로 구분하며, 왼쪽에서 오른쪽으로 검색한다.

which [파일명] : 명령의 절대 경로 호출which 명령어는 PATH 변수의 디렉터리를 검색해 명령의 절대 경로를 찾아 보여준다.

whereis : 명령과 해당 명령의 소스파일, 매뉴얼 페이지 경로 검색whereis 명령어는 설정 파일을 찾을 때 유용하다.

grep [옵션] [표현식] [파일명] : 파일 내용 검색아무 옵션 없이 명령을 실행하면 지정한 파일에서 검색된 문자열을 포함하는 행을 보여준다. 터미널에서는 검색어가 붉게 표시되어 보인다.

파일 명 대신 *를 쓰면 현재 디렉터리에 있는 파일들을 모두 검색한다.

-r(--recursive) : 현재 디렉터리부터 하위 디렉터리를 포함한 모든 파일에서 문자열 검색

-c(--count) : 해당 문자열이 포함된 행 수 출력

-n(--line-number) : 해당 문자열이 포함된 행과 행 번호를 함께 출력

-i(--ignore-case) : 대,소문자 구분 없이 문자 검색

파이프(
|)를 활용한 검색파이프는 여러 명령을 동시에 사용하는 도구로, 프로세스 사이에 정보를 전달하는 통로 역할을 수행한다.
grep명령은 단독으로 사용하기보다 파이프로 다른 명령과 조합하여 결과를 얻는데 유용하게 쓴다.
예를 들어, 파일 목록을 출력하는ls -l결과에grep을 사용하면 파일 목록에서 data라는 문자열을 포함한 결과만 표시한다.
파이프는 일괄적으로 출력을 입력으로 보내 처리하므로,명령A|명령B로 입력하면 명령A의 출력을 명령B의 입력으로 보내버린다.
홈 디렉터리에서ls -l명령을 실행하면 숨김파일까지 모두 표시하므로 출력 결과가 한 화면을 넘는 결과가 일반적이다. 이 때,more나less와 조합하여 사용하면 훨씬 조회가 수월하다.
명령A|명령B|명령C형태로도 사용이 가능한데, 명령 A의 출력을 명령 B의 입력으로, 다시 명령 B의 출력을 명령 C의 입력으로 전달한다.
다음과 같은 형태로 활용할 수 있다.
- 파일 목록을 조회(-ls -l)하여 역순으로 정렬(sort -r)하고 화면 단위로 결과를 출력(more)