# 자주 사용하는 자작 스크립트들

> Clean Markdown view of GeekNews topic #23854. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=23854](https://news.hada.io/topic?id=23854)
- GeekNews Markdown: [https://news.hada.io/topic/23854.md](https://news.hada.io/topic/23854.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-10-23T09:58:03+09:00
- Updated: 2025-10-23T09:58:03+09:00
- Original source: [evanhahn.com](https://evanhahn.com/scripts-i-wrote-that-i-use-all-the-time/)
- Points: 24
- Comments: 2

## Summary

10년 넘게 유지한 **dotfiles 컬렉션**에서 추려낸 실전용 **shell 스크립트 모음**으로, macOS와 Linux 환경의 반복 작업을 단축하고 표준 유틸을 일관된 인터페이스로 감싸서 워크플로우의 마찰을 최소화 합니다. 개발자 입장에서는 일상적인 CLI 흐름을 매끄럽게 자동화하고, **개인 워크플로우를 코드로 구조화**하는 좋은 레퍼런스로 참고할 만합니다.

## Topic Body

- **10년 이상 dotfiles를 유지**하면서 작성한 다양한 shell 스크립트 중 가장 많이 쓰는 것들을 소개함  
- **클립보드·파일 관리·인터넷·텍스트 처리·REPL 런처·날짜/시간·AV·프로세스·퀵 레퍼런스·시스템·그랩백**으로 나뉘며, 각 스크립트는 짧은 래퍼 형태와 **실전 예시** 중심으로 제시  
- 대부분의 스크립트는 **macOS와 Linux**에서 작동하며, 핵심 철학은 “이미 있는 도구의 **번거로운 자질구레함을 평탄화**”하는 것  
  - `pbcopy/xclip`, `python3 -m http.server`, `yt-dlp`, `ffmpeg`, `mpv` 등 **표준 유틸 통합**  
- 가장 많이 쓰는 것으로 `copy/pasta/pastas/cpwd`, `mkcd/tempe/trash/mksh`, `serveit/getsong/getpod/getsubs`, `scratch/straightquote/markdownquote`, `timer/boop/tunes` 등  
  
  
---  
  
### 내 dotfiles를 유지하며 만든 가장 자주 쓰는 스크립트 소개  
  
- 10년 넘게 개인 dotfiles를 관리하면서 만들어 온 다양한 **shell 스크립트** 중, 자주 사용하는 스크립트들을 분야별로 정리함  
- 각 스크립트는 목적, 사용 빈도, 대표 예시를 함께 제공하여 **즉시 적용 가능성**을 높임  
- 공통 목표는 **반복 작업 단축**, **플랫폼 간 추상화**, **안전성·가독성 향상**임  
  
#### 클립보드 관련 스크립트  
  
- `copy`와 `pasta`: 시스템 클립보드 매니저를 감싸는 래퍼로, macOS의 `pbcopy`나 Linux의 `xclip`을 기반으로 함  
  - `copy`: 출력을 클립보드로 복사  
  - `pasta`: 클립보드에서 텍스트를 가져와 출력  
  - 예: `run_some_command | copy`, `pasta > file.txt`, `vim "$(pasta)"`, `pasta | base64 --decode`  
- `pastas`: 클립보드 상태가 변경될 때마다 새로운 내용을 실시간으로 출력하는 툴  
  - 복사한 모든 링크를 파일로 저장하거나, 복수의 링크를 일괄 다운로드할 때 유용함  
  - 예: `pastas > everything_i_copied.txt`, `pastas | wget -i -`  
- `cpwd`: 현재 디렉터리 경로를 클립보드에 복사  
  - 여러 터미널 탭에서 디렉터리 이동 시 편리함  
  
#### 파일 관리 스크립트  
  
- `mkcd foo`: 디렉터리 생성 및 즉시 이동 (`mkdir foo && cd foo` 단축)  
- `tempe`: 임시 디렉터리로 이동 (`cd "$(mktemp -d)"`), 샌드박스 환경에서 임시작업 시 정리 필요 없음  
  - 예:   
    ```  
    # Download a file and extract it  
    tempe  
    wget 'https://example.com/big_file.tar.xz'  
    tar -xf big_file.tar.xz  
    # ...do something with the file...  
  
    # Write a quick throwaway script to try something out  
    tempe  
    vim foo.py  
    python3 foo.py  
    ```  
- `trash`: 파일을 휴지통으로 이동(macos/Linux 지원), 단순 `rm` 대비 실수 방지용  
- `mksh`: 새로운 shell script 파일을 생성하고, 실행 가능하게 설정하며, 에디터로 즉시 열기  
  
#### 인터넷 관련 스크립트  
  
- `serveit`: 로컬 디렉터리에서 정적 파일 서버 구동 (기본 8000번 포트, Python 미설치 시 대체)  
- `getsong`은 `yt-dlp`로 최고 음질 음원 다운로드를 수행  
- `getpod`는 영상을 팟캐스트용 오디오로 받는 래퍼  
- `getsubs`는 공식 자막 우선·자동 자막 폴백 로직으로 **영문 자막 추출**을 수행. **요약 파이프라인**과 백업 용도에 적합함  
  - 예 : `getsubs https://video.example/foo | ollama run llama3.2 "Summarize this"`  
- `wifi off/on/toggle`: 시스템 WiFi 제어, 네트워크 문제 해결 시 사용  
- `url`: URL 문자열을 파싱하여 프로토콜, 호스트명, 경로, 쿼리, 해시 등 분리 및 추출  
  
#### 텍스트 가공 스크립트  
  
- `line 10`: 표준 입력에서 특정 줄 출력 (`head`, `tail`과 유사)  
- `scratch`: `$EDITOR $(mktemp)`와 같이 임시 텍스트 버퍼를 Vim에서 빠르게 여는 용도, 일회성 필기나 작은 변환 작업에 적합  
- `straightquote`: 스마트 인용부호를 일반(직선) 인용부호로 변환, 코드 내 인용부호 문제 방지 및 파일 용량 축소  
- `markdownquote`: 각 줄 앞에 `>` 붙여서 Markdown 인용문 생성  
- `length`: 입력 문자열의 길이 반환 (`wc -c` 대체 가능)  
- `jsonformat`: JSON 데이터를 예쁘게 출력  
- `uppered`/`lowered`: 문자열을 대문자/소문자로 변환  
- `nato bar`: 입력 문자열을 NATO 알파벳 코드로 변환 (`Bravo Alfa Romeo` 등)  
- `u+ 2025`: 유니코드 문자의 이름과 기호 조회  
- `snippets foo`: 특정 단축 문구를 개인 스니펫 사전에서 불러오기   
  - `snippet arrow`는 화살표→, `snippet recruiter` 는 “not interested” 같은 템플릿 메시지   
  
#### REPL 런처 관련  
  
- Ruby의 `irb`에서 영감받아 다양한 언어의 REPL을 빠르게 실행:  
  - `iclj`: Clojure  
  - `ijs`: Deno(없으면 Node)  
  - `iphp`: PHP  
  - `ipy`: Python  
  - `isql`: SQLite(Bash에서 메모리 모드)  
  
#### 날짜 및 시간 스크립트  
  
- `hoy`: 현재 날짜를 ISO 형식(예시: 2020-04-20)으로 출력, 파일명 등 접두어로 활용  
- `timer 10m`: 시간 타이머(10분 등), 완료 시 소리와 OS 알림 전송  
- `rn`: `date`와 `cal`을 활용해 현재 시각과 월간 달력을 보기 좋게 출력  
  
#### 오디오, 비디오, 이미지 처리  
  
- `ocr`: macOS에서 이미지 파일의 텍스트 추출(확장 예정)  
- `boop`: 직전 명령 성공/실패에 따라 소리 알림(테스트 실행 뒤 등에서 직관적 활용)  
- `sfx`: 특정 효과음 파일(`.ogg`)을 재생, `boop`, `timer`와 연계  
- `tunes`: `mpv`로 오디오 파일 재생(셔플 지원)  
- `pix`: `mpv`로 사진 보기  
- `radio`: 선호하는 인터넷 라디오 스테이션 퀵 런처  
- `speak`: stdin에서 읽은 텍스트의 Markdown 제거 후 음성합성(TTS)  
- `shrinkvid`: `ffmpeg`로 영상 파일 압축  
- `removeexif`: JPEG에서 EXIF 데이터 삭제, 향후 다양한 포맷 지원 예정  
- `tuivid`: 터미널 내에서 영상 시청, 실사용 적으나 독특한 기능  
  
#### 프로세스 관리  
  
- `each`: `xargs`, `find ... -exec`의 대안, 복잡한 명령어 실행을 쉽게 수행  
- `running foo`: 지정 키워드로 실행 중 프로세스(PID, 명령 등) 검색 후 읽기 쉬운 형태로 출력  
- `murder`: `kill`의 감싸기, 순차적으로 부드러운 시그널부터 강제로 점진 종료. 프로그램 종료 요청 시 실수 방지  
- `waitfor $PID`: 지정한 PID가 종료될 때까지 대기, 계속 깨어 있는 상태 유지  
- `bb my_command`: 명령어를 진짜 백그라운드 모드로 실행, 데몬 등의 실행에 적합  
- `prettypath`: `$PATH`를 줄바꿈으로 한눈에 보기 쉽게 출력(디버깅 시 유용)  
- `tryna my_command`/`trynafail my_command`: 명령어 성공 시까지 반복(run until success), 실패 시까지 반복(run until fail), 네트워크 등 다양한 자동화에 응용  
  
#### 빠른 참조 툴  
  
- `emoji`: 키워드로 emoji 검색 및 출력  
- `httpstatus`: 모든 HTTP 상태코드 목록 출력, 특정 코드 설명 확인  
- `alphabet`: 영문 알파벳 소문자·대문자 전체 출력(의외로 사용 빈번)  
  
#### 시스템 관리  
  
- `theme 0`/`theme 1`: 시스템 전체 테마(다크/라이트) 변경, Vim, Tmux 등 연계  
- `sleepybear`: 시스템 슬립 모드 진입(macOS, Linux)  
- `ds-destroy`: `.DS_Store` 파일 재귀 삭제, macOS 사용자 폴더 정리 시 유용  
  
#### 기타  
  
- `catbin foo`: PATH 내 파일의 소스코드 바로 보기  
- `notify`: OS 수준 알림 전송, 장시간 작업 완료 시 바로 알림  
- `uuid`: 버전 4 UUID 생성  
  
### 결론  
  
- 이 글에 소개된 스크립트들은 필자가 실제로 자주 활용하는 도구임  
- 직접 만든 단축 명령 스크립트는 **업무 효율화, 실수 방지, 생산성 향상**에 매우 효과적  
- 여러분도 자신만의 자동화 스크립트를 만들어 활용하는 것을 추천

## Comments



### Comment 45336

- Author: neo
- Created: 2025-10-23T09:58:04+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=45670052) 
* trash a.txt b.png 명령은 `a.txt`와 `b.png` 파일을 휴지통으로 옮기는 것임, Mac과 Linux에서 지원함. 내가 예전에 하던 방식은 파일 별로 순차적으로 처리하기 때문에 삭제 소리가 각 파일마다 들리고, Finder의 ⌘Z로 마지막 파일만 복구가 가능함. 개선은 할 수 있지만, 사실 macOS에 기본 내장된 공식 `trash` 명령을 쓰는 게 더 편리함. Finder를 쓰지 않으니 소리나 ⌘Z 복구는 없지만 속도도 빠르고 “Put Back” 기능도 됨. 그리고 JSON pretty-print는 node 말고 jq를 쓴다면 훨씬 더 짧은 코드로 해결 가능하고, 요즘 macOS에는 jq가 미리 설치되어 나옴. uuid 프린트도 마찬가지로 v4 UUID가 필요할 땐 uuidgen을 쓰는 것이 무난함([man page 참고](https://www.man7.org/linux/man-pages/man1/uuidgen.1.html))

  * 셀프 스크립트보다 기본 내장 기능을 쓰는 게 더 나을 때가 많음. 예를 들어 vim에서 markdownquote를 쓰는 대신 ctrl-v로 첫 열을 선택하고 "i> " 후 escape만 누르면 됨. 더 짧고 효율적임. u+ 2025가 왜 ñ를 반환하는지 궁금한데 실제 유니코드 값은 U+00F1 임. 그리고 catbin foo는 cat "$(which foo)"와 같음. zsh를 쓴다면 cat =foo가 더 짧고 강력함. zsh에서는 = 뒤에 자동 완성이 되어서 긴 명령어에도 안전하게 쓸 수 있음. 나는 file =firefox, vim =myscript.sh처럼 자주 씀

  * 나는 저자가 uuidgen을 몰랐을 것이라 추측함. 이런 지식이나 설정을 공유하면 항상 내 사각지대가 밝혀지는 점이 좋아서 공유가 중요한 것임

  * 파이썬도 기본적으로 JSON을 pretty-print 가능함
    ```
    $ echo '{ "hello": "world" }' | python3 -m json.tool
    {
      "hello": "world"
    }
    ```

  * `trash` 정보 고마움. 나는 그동안 "tell app \"Finder\" to move {%s} to trash" 식으로 AppleScript를 써서 여러 파일을 휴지통에 보냈음

  * rm과 trash의 대안으로 rip도 추천함 [rip 프로젝트 링크](https://github.com/nivekuil/rip)

* 개발자의 인생 사이클이 참 신기함. 처음에는 바닐라 셸 환경만 쓰다가, 1~2년 차에는 스크립트와 bash alias를 수백 줄씩 만들어 씀. 15년 차가 된 지금은 오히려 최대한 기본 셸만 쓰고, alias도 안 쓰며, 복잡한 것은 Python이나 Go로 처리함

  * 이런 경향은 뭔가 각성한 상태라기보다는 그냥 게으름에서 오는 것 같음(나도 똑같이 해서 하는 말임). 커스텀 환경을 파고드는 동료들 덕분에 새로운 도구들을 자주 배우게 되고, 최근에는 atuin, fzf 같은 도구도 리눅스에 추가함

  * dotfile에 alias랑 function을 적어서 자주 쓰는 명령어를 기록/기억하는 용도로 씀. 자주 쓰는 도구 모음을 계속 업데이트하고, 새 워크스테이션에 이전하는 것도 쉬움

  * 예전에 nix 컴퓨터가 한 대만 있었을 때는 커스텀을 많이 하고 싶었음. 지금은 여러 대를 동시에 쓰다 보니 필요한 패키지만 설치해서 환경을 통일함

  * python으로 짠 것도 여전히 script라고 부름. script라는 용어가 쉘 스크립트에만 한정된 건 아니라고 생각함

  * 요즘은 젊은 엔지니어들과 일하면서 그들이 여러 dotfiles를 쓰는 걸 보면 “나도 옛날엔 저렇게 했었지, 귀찮았지”라고 느낌. 이제는 툴을 선별적으로 사용하고, 필요한 것에 유연하게 맞춤. 다른 사람 스타일도 존중함

* 이런 실전 팁 게시글을 HN에서 찾는 게 정말 좋음. 다른 개발자들이 실제로 어떻게 일하는지, 내가 뭘 배워서 적용할 수 있을지 궁금함. 처음에는 “나한텐 필요 없겠지”라고 생각해도, 어떤 작업이 수월해지면 그 작업 자체가 새로운 워크플로우를 만듦. 그래서 일단 해보고 맞는 걸 남기는 편임. 원글의 스타일도 마음에 듬—실제 사용 빈도를 같이 적어준 점이 진짜 실용적임. 나는 간단한 작업은 브라우저 devtools 열어서 JavaScript로 끝내는 경우가 많음. (예: 문자열을 소문자로 변환할 때 등)

  * 저자 방식과 내 방식의 소요 시간, 스크립트 제작/기억/참조/마이그레이션 비용까지 따져서 실제 cost-benefit analysis를 해보면 흥미로울 것 같음

  * [이 Bash 단축키 치트시트 이미지](https://raw.githubusercontent.com/fliptheweb/bash-shortcuts-cheat-sheet/master/moving_cli.png)가 많은 도움이 됨

* line 스크립트 대신, sed로 특정 줄 출력이 더 간단함
    ```
    sed -n 2p file
    ```
  두 번째 줄 출력 가능. 여러 줄 출력도 
    ```
    sed -n 2,4p file
    ```
  처럼 할 수 있어서 line 스크립트보다 유리함

  * sed 명령어를 여러 개 묶어서 쓸 일이 많음. 그럴 때마다 첫 sed 명령을 계속 바꿔야 함. 때론 sed 전에 grep이 필요할 때도 있는데, cat, tail, head로 쪼개면 각 기능을 모듈처럼 써서 더 유연해짐. 각각이 한 가지 일만 하도록 만드는 유닉스 철학에 맞음

* 내가 자주 쓰는 간단한 스크립트들이 있음. 예를 들어: 
    ```
    #!/usr/bin/env bash
    # ~/bin/,dehex

    echo "$1" | xxd -r -p
    ```
    ```
    #!/usr/bin/env bash
    # ~/bin/,ht

    highlight() {
      # 색상: 30=검정, 31=빨강, 32=초록, ...
      escape=$(printf '\033')
      sed "s,$2,${escape}[$1m&${escape}[0m,g"
    }

    if [[ $# == 1 ]]; then
      highlight 31 $1
    elif [[ $# == 2 ]]; then
      highlight 31 $1 | highlight 32 $2
    elif [[ $# == 3 ]]; then
      highlight 31 $1 | highlight 32 $2 | highlight 35 $3
    elif [[ $# == 4 ]]; then
      highlight 31 $1 | highlight 32 $2 | highlight 35 $3 | highlight 36 $4
    fi
    ```
  개인 스크립트는 ,(콤마)로 앞에 붙여두어 빠르게 전환할 수 있음. 나만의 스크립트들을 히스토리에서 주기적으로 통계 내보고, 더는 안 쓰는 것들은 정리하는 작업이 가치 있다고 느낌

* 아직 일반화는 못했지만 `unmv` 스크립트로 꽤나 편리하게 작업하고 있음
    ```
    #!/bin/sh
    if test "$#" != 2
    then
      echo 'Error: unmv must have exactly 2 arguments'
      exit 1
    fi
    exec mv "$2" "$1"
    ```

* 좋은 팁들이 많지만, 나는 대체로 표준 유틸리티(sed, awk, grep, xargs 등)를 배우고 씀. 이유는 여러 시스템을 오가며 작업을 하는데, 내 개인 스크립트와 alias들은 대부분 미설치되어 있기 때문임. 표준 유틸로 거의 모든 일을 할 수 있음

  * 정말 공감함. 어디서든 작업할 수 있도록 표준만 쓰게 됨. 하지만 정말 잘 만든 도구는 결국 기본 설치나 apt-get 설치가 쉬워지기도 함. 개인 스크립트 모음보다는, 관리 잘 되는 패키지 형태가 더 바람직하다고 생각함

* 내가 제일 좋아하는 압축 해제 스크립트 공유함
    ```
    # ex - archive extractor
    # 사용법: ex <파일>
    function ex() {
      if [ -f $1 ] ; then
      case $1 in
        *.tar.bz2) tar xjf $1 ;;
        *.tar.gz) tar xzf $1 ;;
        *.tar.xz) tar xf $1 ;;
        *.bz2) bunzip2 $1 ;;
        *.rar) unrar x $1 ;;
        *.gz) gunzip $1 ;;
        *.tar) tar xf $1 ;;
        *.tbz2) tar xjf $1 ;;
        *.tgz) tar xzf $1 ;;
        *.zip) unzip $1 ;;
        *.Z) uncompress $1;;
        *.7z) 7z x $1 ;;
        *) echo "'$1' cannot be extracted via ex()" ;;
      esac
      else
        echo "'$1' is not a valid file"
      fi
    }
    ```

  * 이걸 압축하는 반대 counterpart도 만들고 싶음

  * 나는 dtrx를 쓰는데, 자동으로 압축을 폴더 안에 풀어줘서 좋음

  * 나는 aunpack이 더 편함

  * 정말 깔끔함

  * inotify와 systemd user service까지 추가하면 한 단계 진화할 듯함. 이미 패키지로 존재하는 버전도 있음. 직접 만드신 것은 정사각형 바퀴(재발명) 느낌

* mp4 인코딩이나 자르기에 항상 쓰는 두 가지 함수가 있음. flag 덕분에 WhatsApp, 모바일 Discord 등 다양한 환경에서 호환성이 극대화됨
    ```
    ffmp4() {
      input_file="$1"
      output_file="${input_file%.*}_sd.mp4"

      ffmpeg -i "$input_file" -c:v libx264 -crf 33 -profile:v baseline -level 3.0 -pix_fmt yuv420p -movflags faststart "$output_file"

      echo "Compressed video saved as: $output_file"
    }

    ffmp4 foo.webm  # foo_sd.mp4로 변환
    ```

    ```
    fftime() {
      input_file="$1"
      output_file="${input_file%.*}_cut.mp4"
      ffmpeg -i "$input_file" -c copy -ss "$2" -to "$3" "$output_file"

      echo "Cut video saved as: $output_file"
    }

    fftime foo.mp4 01:30 01:45  # foo_cut.mp4 생성
    ```
  fftime은 원본을 다시 인코딩하지 않고 빠르게 자르지만, 영상에 따라 약간 문제(재생 불가 등)가 있을 수 있음. 재인코딩하려면 -c copy를 빼면 됨

* alias나 function을 만들고 테스트할 때마다 `~/.zshrc`를 바로 반영하는 게 편해서 아래처럼 쓴 alias를 씀
    ```
    alias vz="vim ~/.zshrc && . ~/.zshrc"
    ```
  그리고 Mac에서 docx 파일 grep용으로 아래 function을 씀
    ```
    docgrep() {
      mdfind "\"$@\"" -onlyin /Users/xxxx/Notes 2> >(grep --invert-match ' [UserQueryParser] ' >&2) | grep -v -e '/Inactive/' | sort
    }
    ```
  또, 내 Mac의 클립보드를 익명화해서 ChatGPT나 사내 Slack 등 공개 채널에 붙여넣을 때, 디버깅 용도로 아래 함수를 돌림. 함수 실행하면 새로 변환된 클립보드를 stdout에 표시 해주기 때문에, 놓친 부분이 있는지 확인 가능함
    ```
    anonymizeclipboard() {
      my_user_id=xxxx
      account_ids="1234567890|1234567890" #regex
      corp_words="xxxx|xxxx|xxxx|xxxx|xxxx" #regex
      project_names="xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      pii="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      hostnames="xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx" # regex
      pbpaste | sed -E -e 's/([0-9]{1,3})\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/\1.x.x.x/g' \
      -e "s/(${corp_words}|${project_names}|${my_user_id}|${pii}|${hostnames})/xxxx/g" -e "s/(${account_ids})/1234567890/g" | pbcopy
      pbpaste
    }
    alias anon=anonymizeclipboard
    ```

  * 이거 진짜 좋음. 이런 일이 자주 생기는데 마땅한 방법을 못 찾아서 애먹었음

### Comment 45401

- Author: krepe90
- Created: 2025-10-24T10:56:06+09:00
- Points: 2

긱뉴스에 올라왔던 [Ask GN: 자주 사용하는 셸 스니펫이 있으신가요?](https://news.hada.io/topic?id=20421) 라는 글도 생각나네요
