[Linux] 명령어 2

zzwon1212·2023년 9월 21일
0

Linux

목록 보기
3/11
post-thumbnail

1. stdio(표준 입출력)

1.1. file channel

  • 파일에 입출력하기 위한 통로로, 하드웨어에 직접 접근하지 않고 표준화된 입출력 방식을 이용하는 가상화 레이어의 일종
  • 파일에 입출력을 하기 위한 메타 정보를 가지는 객체로 프로세스 스코프에서 유효하여 프로세스 종료와 함께 휘발된다.
  • 파일 서술자(fd: file descriptor): file channel에 붙여진 유일한 식별자(identifier)이며 숫자로 명명되고 양수 0부터 시작한다.
  • 예약된 파일 서술자
    • 0: stdin(표준 입력)
    • 1: stdout(표준 출력)
    • 2: stderr(표준 에러)

1.2. pipe

  • IPC(Inter-Process Communication)의 일종
  • 2가지 종류
    • anonymous pipe: temporary → 프로세스가 종료되면 사라진다.
      find ~ | wc -l # find의 출력(stdout)이 wc의 입력(stdin)과 연결됨
      find ~ > tmp.txt; wc -l < tmp.txt; rm tmp.txt # anonymous pipe를 사용하지 않을 경우 이렇게 길어짐
      • 프로세스들의 직렬 연결에 사용된다.
      • 명령행에서 |(vertical bar)를 사용한다.
    • named pipe: persistency → 프로세스가 종료되어도 남아 있다.
      • mkfifo 명령(or POSIX C API)를 사용하여 생성한다.

1.3. redirection

  • 파일 채널의 방향을 다른 곳으로 연결한다.
    ls > filelistl.txt
    sort < names.txt
    strace ls 2> strace.txt # fd2인 stderr를 파일로 저장한다.
    • A > B: 명령어 A의 실행 결과(stdout)를 화면에 출력하지 않고 파일 B로 보낸다.
    • A < B: B를 A의 stdin으로 연결한다.
    • A >> B: 방향은 >과 같고, 추가(append)하는 모드

1.4. cat(catenate)

  • 용도
    cat ~/.bashrc
    cat > hello.txt
    'Hello World'
    ^D
    • 파일의 내용을 stdout으로 출력한다.
    • stdin의 입력을 redirection하여 파일로 출력한다.

2. archive, compress

2.1. archive

  • tar, cpio
    -tar [ctxv] [f archive-file] files...
    • c(create): 아카이브를 생성
    • t(test): 테스트(내부를 확인)
    • x(extract): 파일을 풀어냄
    • v(verbose): 상세 정보 출력(실무에서 사용되지 않음)
    • f archive-file: 입출력할 아카이브 파일명. 아래 두 코드는 같은 결과를 얻는다.
      tar c *.c > arc_c.tar # redirection을 이용
      tar cf arc_c.tar *.c # f를 이용
    • --exclude file: 특정 파일을 제외

2.2. compress

프로그램확장자설명
compressZ현재는 거의 사용되지 않는다.
gzipgzGNU에서 만든 zip (과거에 많이 사용)
bzip2bz2텍스트 압축에 유리했었다.
xzxz텍스트에 강하지만, 느리다.
lz4lz4빠르고 무난한 성능
zstdzst빠르고 좋은 압축률을 가졌다. 멀티스레드 지원
  • zstd [OPTIONS] [-|input-file] [-o output-file]

    • -d: decompress

    • -c: 표준 출력(stdout)으로 결과물을 보낸다.

    • -T#: 멀티스레드 사용(#: 개수, 0: 자동)

    • -#: compression level [1-19] (default: 3), 변화가 크지는 않다.

    • 압축

      tar c ./data ./exp | xz -T0 > bak_data.tar.xz
      tar c ./data ./exp | zstd -T0 > bak_data.tar.zst
      
      # 최신 방식: a로 확장자를 자동으로 판단함 / 단점: 멀티스레드를 사용하지 못함
      tar cfa bak_data.tar.xz ./data ./exp
      tar cfa bak_data.tar.zst ./data ./exp
    • 풀기

      xz -dcT0 bak_data.tar.xz | tar x
      zstd -dcT0 bak_data.tar.zst | tar x
      
      # 최신 방식: a로 확장자를 자동으로 판단함 / 단점: 멀티스레드를 사용하지 못함
      tar xfa bak_data.tar.xz
      tar xfa bak_data.tar.zst

hard link와 symbolic link

3.1. i-node

  • 파일의 메타 정보 및 관리용 객체
  • 파일은 1개의 고유 i-node를 가지며, i-node를 통해 파일의 데이터에 접근한다.
  • i-node number(i-num)으로 구별되며, disk partition 내에서 유일한 식별자이다.
  • 메타 정보: 파일명, 시간, 사이즈, 소유권, 권한 등
  • 위 그림에서 파일 1과 파일 2는 다른 파일처럼 보이지만 hard link가 같은 i-node를 가리키기 때문에 같은 파일이며 하나의 용량을 공유한다.
  • hard link 생성
    • same i-node를 가리키므로 동일 파티션 내에서만 생성 가능하다.
    • regular file만 생성 가능하다.(실체를 가짐) directory나 device file 등은 불가능하다.
  • 예제
    mkdir ~/work
    cd !$
    touch hello.txt
    ls -l
    ln hello.txt ../hardlink.txt
    ls -li
    ls -li ..

    두 파일의 i-num이 9265로 같으며, hard link의 개수가 2이다. 이때 하나의 파일을 수정하면 다른 파일도 수정된다.
  • 윈도우의 바로가기와 비슷하다. 파일의 위치만을 가리키므로 다른 파티션, 모든 종류의 file에 생성 가능하다.
  • 예제
    ln -s ../hardlink.txt symlink.txt # symlink를 만들 때에는 만들려는 그 위치로 가서 만들기를 권장한다.
    ls -l
  • 사용되는 예
    • 멜론 TOP 100
      ln -s /exp/disc/chet_atkins_1/02_sails.mp3 /exp/melon/rec100/2.mp3
    • 라이브러리 버전 관리: ls -l /usr/lib
      ln -s /usr/lib/libflamegraph.so.0.5.0 /usr/lib/libflamegraph.so

3.4. which

  • PATH에 존재하는 파일을 검색

    which find
    >>> /usr/bin/find
    
    which bash
    >>> /bin/bash
  • symlink가 여러 단계로 가리키는 경우 symlink의 canonical path를 따라가는 기능
  • readlink -f <symlink>: canonical path를 따라가며 마지막 링크를 제외한 모든 링크가 존재할 때 성공
  • readlink -e <symlink>: canonical path를 따라가며 모든 링크가 존재할 때 성공
  • canonical이란?
    컴퓨팅 환경에서 실체를 가지는 standard, official의 의미이다. symlink는 실체를 가리키는 것이 아니므로 따라가기 전에 대상을 한정할 수 없고, 순차적으로 따라가야지만 canonical path를 알 수 있게 된다.
  • 예제 1
    touch hardlink
    ln -s hardlink sym1
    ln -s sym1 sym2
    ln -s sym{2,3} # brace expansion, == ln -s sym2 sym3
    ls -l sym* hardlink
    readlink -f sym2
    readlink -e sym2
    rm hardlink
    readlink -f sym3
    readlink -e sym3
    모든 링크가 존재하는 것은 아니기 때문에 fail
  • 예제 2: Ubuntu의 경우 locate는 symlink이다.
    which locate
    ll /usr/bin/locate
    readlink -e /usr/bin/locate

📙강의 - 코인즈월렛 기술이사 김선영

profile
JUST DO IT.

0개의 댓글

관련 채용 정보