[네이버클라우드] AIaaS 개발자 과정/Linux

[네이버클라우드캠프] 2023.4.25 Linux(2) - 파일 다루기, vi editor, 홈 디렉토리와 환경설정

_꼬마돌 2023. 4. 29. 21:30
반응형

파일 다루기

  파   일 디렉터리
생   성  touch  mkdir
 vi  mkdir -p
 cat  
복   사  cp  cp -r
 -i  
 -f  
이   동  mv  mv
이름 바꾸기  mv  mv
삭   제  rm  rmdir, rm -r
 rmdir은 rm -r로 많이 사용됨.
 rename 명령은 Redhat계열과 Debian계열의 사용법이 조금 다름.

* 자주 사용하는 옵션

-i  # interactive 대화형 모드
-f  # force       강제
-r  # recursive   재귀적 작업, 하위디렉터리까지 포함

 

  • 파일과 디렉터리 만들기
 $mkdir d1 && cd d1  디렉토리 'd1'을 생성하고 해당 디렉토리로 이동
 $ls && pwd  "&&"은 앞의 명령어가 성공적으로 실행된 후에만 뒤의 명령어를 실행하도록 하는 연산자이다.
 ls는 현재 디렉토리에 있는 파일과 디렉토리 목록을 출력하고, pwd는 현재 작업중인 디렉토리
 의 경로를 출력한다.
 $touch a1  빈 파일 "a1" 만들기
 $cal > a2  cal(달력) 내용을 a2 파일로 '저장'
 $date >> a3  date 내용을 a3 파일에 '추가'
 $cat > a4  내용 입력 후 빈 줄에서 ^D
 mkdir d10  디렉토리 "d10" 생성
 mkdir d2 d3 d4  디렉토리 d2, d3, d4 생성
 touch -t 200012251230  파일명을 임의의 시간으로 변경
 mkdir {a..k}  디렉토리 여러 개 한 번에 만들기
 touch b{1..10}  빈 파일 여러 개 한 번에 만들기
 * 명령어 || 명령어    : or 연산. 앞 명령어가 참이면 뒤 명령어는 실행하지 않음.
 * 명령어 && 명령어 : and 연산. 앞 명령어가 참일때만 뒤 명령어 실행 

 

  • 복사하기 - cp

 

 $cp /etc/bashrc .  현재 위치(.)로 /etc/bashrc 파일 복사
 $cp /etc/bashrc  목적지가 생략되어 error
 $cp /etc/bashrc bs3  /etc/bashrc 파일을 다른 이름(bs3)으로 복사
 $cp /etc/* .  /etc/ 디렉토리의 모든 파일과 디렉토리(*)를 현재 위치(.) 복사
 cp -r /etc .  /etc/ 디렉토리 전체를 현재 위치 (.) 로 복사. -r 옵션은 디렉토
 리와 그 하위 디렉토리 및 파일을 모두 복사하도록 합니다.
 cp -r /etc ee  /etc/ 디렉토리 전체를 ee라는 이름의 디렉토리로 복사하는 명
 령
 cp p-p /etc/vimrc .  /etc/vimrc 파일을 현재 위치 (.)로 원본파일을 보존하여 복사
 cp -l  hard link
 cp -s  soft link
 cp -v  복사전 복사할 파일 출력
 cp -p  속성 유지하며 복사

 

  • 이동, 이름 바꾸기 - rename, mv
 $mv a20 AA30  a20 파일의 이름을 AA30으로 바꾸기
 $mv AA30 usr/local  AA30 파일/디렉토리를 usr/local 디렉토리로 이동

 

  • 삭제 - rm, rmdir
 $rm a*  a로 시작하는 모든 파일 삭제
 $rm [b-f]*  b에서 f로 시작하는 모든 파일 삭제
 $rm *  모든 파일 삭제
 $rm -i a*  a로 시작하는 모든 파일 삭제. 단, 삭제할 때 마다 사용자에게 확인 받도록 함
 $rm -f b*  이름이 b로 시작하는 모든 파일을 강제로 삭제. -f 옵션은 삭제할 파일이 존재하지 않을 때 오류
 메세지를 표시하지 않고 무시하고 계속 진행하도록 함.
 $rm -f [^jtbc]  j, t, b, c 중 어떤 문자도 아닌 파일을 강제로 삭제하는 명령. 
 $rm -rf /tmp  /tmp 디렉토리와 그 하위 모든 파일과 디렉토리를 강제로 삭제하는 명령. 
 $rm [a-c]*  파일 이름이 a, b, c 중 하나로 시작하는 파일을 모두 삭제하는 명령 
 $rm [!a-c]*  파일 이름이 a, b, c로 시작하지 않은 모든 파일을 삭제하는 명령 
 $rm [^a-f]*  파일 이름이 a부터 f까지의 알파벳 중 하나로 시작하지 않는 모든 파일을 삭제하는 명령 

* rm 명령어는 파일을 삭제하는 명령어이다. 따라서 rm 명령어를 사용하여 디렉터리를 삭제하려면 -r 옵션을 사용해야 한다. rm -r directory 명령어는 directory라는 디렉터리를 포함하여 하위 디렉터리와 파일을 모두 삭제한다.

 

반면, rmdir 명령어는 빈 디렉터리를 삭제하는 명령어이다. 따라서, rmdir 명령어를 사용하여 디렉토리를 삭제하려면 해당 디렉터리가 비어있어야 한다. 삭제하려는 디렉터리가 하위 디렉터리나 파일을 포함하고 있다면, rmdir 명령어를 사용하여 삭제할 수 없다.

 

 

  • 명령 프롬프트 - Ctrl키 활용 (^ = Ctrl Key)
 ^U  명령어 삭제, ^/
 ^C  cancel, ^L: clear
 ^W  한 단어 지우기
 ^D  파일의 끝 (EOF), logout
 ^a  처음으로, ^e: 마지막으로
 ^w  뒤에서부터 한 단어 삭제
 ^p  이전 명령어 (위쪽 방향키와 같음)
 ^n  다음 명령어 (아래쪽 방향키와 같음)
 ^t  바로 이전 문자와 맞바꾸기
 ^s  suspend
 ^q  suspend 해제
 ^d  현재 커서 문자 삭제
 ^f  →, ^b: 좌로 이동
 ^k  커서부터 끝까지 삭제, ^u: 커서부터 처음까지 삭제
 ^h  ←, ^m: Enter

vi editor

vi 에디터는 윈도우에서 메모장과 같은 unix 계결의 범용 에디터이다. 가장 많이 사용되며 막강한 기능을 자랑한다. 하지만 메모장과는 사용 환경이 완전히 다르며 익숙해질 때까지 어느 정도의 시간이 필요하다.
현재 커서의 위치가 작업이 기준점이기 때문에 중요하다.

 

vi 에디터의 4가지 모드

 Normal Mode (명령 모드)  vi 에디터를 실행했을 때 기본 모드
 텍스트를 편집하는 것이 아니라 명령을 입력하는 모드
 다른 모드로 전환하거나 파일을 저장, 종료하는 등의 명령을 입력할 수 있다.
 Insert Mode (입력 모드)  현재 커서 위치에서 텍스트를 입력할 수 있는 모드
 i 를 눌러 현재 위치에서 입력을 시작할 수 있으며, ESC를 눌러 Normal Mode로
 돌아갈 수 있다.
 Visual Mode (시각 모드)  선택한 영역을 시각적으로 강조하여 작업할 수 있는 모드
 v 를 눌러 현재 위치에서 선택을 시작할 수 있으며, ESC를 눌러 Normal Mode로 
 돌아갈 수 있다.
 Command-Line Mode (명령행 모드)  파일 저장, 종료, 검색 등 다양한 명령을 실행할 수 있는 모드
 : 를 눌러 현재 위치에서 명령을 입력할 수 있으며, 명령 실행 후 다시 Normal Mod
 e로 돌아갑니다.

 

입력모드

i  현재 커서 앞부터 입력 (insert)
a  현재 커서 다음부터 입력 (append)
o  다음 줄 첫 줄부터 입력
I  현재 line 처음에 추가
A  현재 line 마지막부터 추가
O  현재 line 한 줄 위에 추가
cc  현재 line 삭제 후 insert
cw  단어 삭제 + insert

 

시작과 종료

 $vi aa.c  aa.c 라는 이름으로 vi 편집기 실행
 :w  write, 저장
 :w bb.c  bb.c 라는 이름으로 저장 (다른 이름으로 저장)
 :wq , :x , ZZ  저장 후 종료
 :wq!  저장 후 강제 종료 (! : 강제)
 :q!  저장하지 않고 강제 종료

 

line, 단어, 문자 단위 작업

yy  라인 복사
dd  라인 잘라내기
p  붙여넣기
yw  단어 복사
dw  단어 잘라내기
P  윗 줄에 붙여넣기
u  undo
^r  redo
R  Replace
~  대 / 소문자 변환
x  한 문자 삭제
J  두 줄 합치기
x , dl  현재 위치 한 문자 삭제
X , dh  이전 위치 한 문자 삭제
d0  현재행의 처음까지 삭제
D , d$  현재행의 끝까지 삭제
dj  현재행과 다음행 삭제
dk  현재행과 이전행 삭제

 

커서의 이동

h  좌
j  하
k  상
l  우
[[  처음으로
]]  끝으로
gg  처음으로
G  끝으로
:20  20번째 행으로
:35  35번째 행으로
:10  10번째 행으로
15G  50번째 행으로
30G  30번째 행으로
^ , 0  행의 맨 앞으로
$  행의 맨 끝으로
w  단어 단위 이동. 다음 단어
b  단어 단위 이동. 이전 단어
^D  반 화면 아래로
^U  반 화면 위로
^F  한 화면 아래로
^B  한 화면 위로

* /etc : 편집기 내에서 etc 검색

  /5    : 편집기 내에서 5 검색

  ?korea : 편집기 내에서 korea 검색 

  :3, 10 s/aa/AA : 3~10라인 aa -> AA로 변경

  :10, 30 s/bb/BANK : 10~30라인 bb -> BANK로 변경

  :10, 30 s/bb/BANK/g : 여러 번 나와도 모두 변경, global

  :1,$ s/aa/AA : 처음부터 끝까지

  :% s/aa/AA : 전체

 

* 같은 단어 찾기 : 단어 위에서 Shift + 8

* manual 보기 : 단어 위에서 Shift + k

 

환경설정, 기타

 :set  설정 내용 보기
 :set all  전체 설정
 :f  현재 파일
 :set number  번호 붙이기
 :set nonumber  번호 해제
 :se nu  번호 붙이기 단축 명령
 :se nonu  번호 해제 단축 명령
 :se ai  auto indent
 :se noai  auto indent 끄기
 :se ts=5  tab stop
 :!bash  bash 명령
 :r ! date  date 경과를 파일에 삽입
 :20 r ! cal  20라인에 cal 삽입
 :set cursorline  커서 있는 라인에 줄 표시

set mouse=a 마우스 설정

set mouse=r 마우스 설정 해제

mouse 설정 지정하면 자동으로 Visual mode로 전환

 

$vi ~/.vimrc    //vim 기본 설정 파일

1 se nu ai ci si
2 se ts=4 sw=4
3 se ruler title showmatch
4 syntax on
5 hi comment ctermfg=red

#리눅스를 설치한 뒤 가장 먼저 해주는 설정 중 하나

 

창 분할

:vs aa   # 세로로 분리
:sp bb   # 가로로 분리
^WW      # 창전환

세로로 분리한 모습
가로로 분리한 모습
가로와 세로 동시에 분할할 수도 있다.

 

C Compile 해보기

 [root@kwc ~]# vi Ctri.c

  1 #include <stdio.h>
  2
  3 int main() {
  4     int i, j, k;
  5
  6     for (i = 1; i <= 5; i++) {
  7         for (j = i; j < 5; j++) {
  8             printf(" ");
  9         }
 10         for (k = 1; k < 2 * i; k++) {
 11             printf("*");
 12         }
 13         printf("\n");
 14     }
 15
 16     return 0;
 17 }

:wq

에러가 났다. include에 c를 빼먹다니..

[root@kwc ~]# vi Ctri.c
[root@kwc ~]# gcc Ctri.c -o ctri
[root@kwc ~]# ./ctri
    *
   ***
  *****
 *******
*********

 

C++ Compile 해보기

[root@kwc ~]# vi C++tri.cpp

  1 #include <iostream>
  2 using namespace std;
  3
  4 int main() {
  5     int n;
  6     cout << "Enter the number of rows: ";
  7     cin >> n;
  8
  9     for (int i = 1; i <= n; i++) {
 10         for (int j = 1; j <= n - i; j++) {
 11             cout << " ";
 12         }
 13         for (int k = 1; k <= 2 * i - 1; k++) {
 14             cout << "*";
 15         }
 16         cout << endl;
 17     }
 18     return 0;
 19 }

:wq

[root@kwc ~]# g++ -o c++tri C++tri.cpp
C++tri.cpp: In function ‘int main()’:
C++tri.cpp:13:37: error: expected primary-expression before ‘=’ token
   13 |                 for (int k = 1; k < = 2 * i - 1; k++) {
      |                                     ^
   # 이번에도 오류가 났다. 사소한 오타가 정말 많이 나는구나..

[root@kwc ~]# g++ -o c++tri C++tri.cpp
[root@kwc ~]# ./c++tri
Enter the number of rows: 6
     *
    ***
   *****
  *******
 *********
***********

 

Java Compile 해보기

[root@kwc ~]# vi Jtri.java

  1 public class Jtri {
  2     public static void main(String[] args) {
  3         int n = 5;
  4         for (int i = 0; i < n; i++) {
  5             for (int j = 0; j < n - 1; j++) {
  6                 System.out.print(" ");
  7             }
  8             for (int j = 0; j < 2 * i + 1; j++) {
  9                 System.out.print("*");
 10             }
 11             System.out.println();
 12         }
 13     }
 14 }

:wq

[root@kwc ~]# javac Jtri.java
[root@kwc ~]# java Jtri
    *
    ***
    *****
    *******
    *********

홈 디렉터리와 환경설정

Home 디렉토리

Multi user 시스템이기 때문에 자신의 데이터는 보호받아야 하고 남의 집에 허락 없이 침입해서는 안 된다. 
시스템의 중요한 파일들은 일반 사용자가 함부로 수정, 삭제할 수 있게 해서는 안 된다. 
개인은 자신의 홈 디렉터리에서만 필요한 작업들을 할 수 있다. 

 

Shell이란?

사용자들이 내리는 명령어들을 해석하여 기계어로 번역한 다음 운영체제인 Kernel에게 전달해 주는 역할을 한다.
커널과는 별도로 운영되며 사용자가 입력한 명령어가 잘못되었거나 해석하지 못했을 경우, Kernel에 전달되지 않고 Shell 차원에서 미리 예약된 메시지를 보낸다. 

 

SHELL 관련 명령어

 $echo $SHELL  현재 쉘
 $env  환경 변수
 $chsh -l  사용 가능한 shell 보기
 $enable  내부 명령어 보기
 $!100  이전에 실행한 명령어 중에서 100번째로 실행한 명령어를 다시 실행함
 $!!  이전에 실행한 명령어를 다시 실행함
 $alias  현재 시스템에 등록된 alias 목록을 출력함
 $unalias [alias 별칭]  해당 alias 삭제
 $unalias -a  현재 세션에서 설정된 모든 alias를 삭제하는 명령어.
 별도의 확인 메세지 없이 모든 alias가 삭제되기 때문에 주의해야함.
alias : 명령어에 대한 별칭이다. 명령어가 긴 경우, 짧고 알기 쉽게 별칭을 부여하여 사용하는 것이다.

 

SHELL 지역변수 환경변수

지역변수 : set
시스템이 가지고 있는 설정 값들을 의미하며, 다시 로그인해도 그 값을 유지 
환경변수 : env
현재 로그인한 터미널에서만 적용되는 변수로, 다시 로그인하면 소면. 현 세션에서만 유효

 

Bash 경로 설정하기

bash는 현재 경로에 실행파일이 존재하더라도 PATH 변수에 경로가 등록되어 있지 않다면 command not found 에러를 발생시킨다. 그래서 현재를 나타내는 ./를 붙인 후에 실행해야 명령어를 인식한다. 
./을 생략해도 실행 가능하게 하기 위해서는 설정이 필요하다. 기타 실행 파일은 ~/bin 디렉터리를 생성하고 그곳에 모아두면 된다. 

> 현재 경로 PATH 환경변수에 추가하기
$PATH=$PATH:.
$echo $PATH   

 

History

bash는 가장 최근의 명령 1000개를 저장하고 있다. 
logout 하면 Memory에 있는 history를 .bash_history에 저장한다.
$echo $HISTSIZE : 현재 shell에서 기억하는 최대 명령어 개수를 출력

$history -a : 현재까지 실행한 명령어 리스트를 .bash_history 파일에 저장한다. logout 하고 다시 실행하더라도 이전에 실행했던 명령어를 불러올 수 있다.

$history -c : 현재까지 실행한 명령어 리스트를 모두 삭제한다. 

$nl ~/.bash_history : 파일에 저장된 모든 명령어들을 출력한다. shell 세션을 종료하고 다시 시작하더라도, 이전에 실행한 모든 명령어들을 볼 수 있다.

 

자동 완성 기능 Tab

tab키를 이용하여 명령어나 경로를 쉽게 작업할 수 있다.
시간절약과 오타를 줄일 수 있다!

 

Shell Script 연습

[root@kwc ~]# vi k.sh
1 #!/bin/bash
2
3 echo
4 echo -n 이름은:
5 read A
6
7 echo -n 나이는:
8 read B
9 echo 이름 : $A, 나이 : $B
10
11 echo "현재 시스템 사용자 목록"
12 who | sort | nl
13
14 echo Good-Bye!
15 echo
:wq

[root@kwc ~]# bash k.sh
이름은:꼬마돌
나이는:27
이름 : 꼬마돌, 나이 : 27
현재 시스템 사용자 목록
     1  root     pts/0        2023-04-29 12:41 (10.0.2.2)
     2  root     tty1         2023-04-29 12:40
Good-Bye!

[root@kwc ~]# ./k.sh
-bash: ./k.sh: Permission denied   # 권한이 없어서 허가 거부
[root@kwc ~]# chmod 755 k.sh       # 권한 모드 변경
[root@kwc ~]# ./k.sh

이름은:꼬마돌
나이는:27
이름 : 꼬마돌, 나이 : 27
현재 시스템 사용자 목록
     1  root     pts/0        2023-04-29 12:41 (10.0.2.2)
     2  root     tty1         2023-04-29 12:40
Good-Bye!

반응형