요약. 윈도우에서 파일을 만질 때 길은 두 가지입니다. 탐색기를 열거나, 터미널을 열거나입니다. 어느 쪽이 더 낫냐는 질문에는 답이 없습니다. 실제로 시간이 새는 곳은 다른 데입니다. 한 가지 일을 하다가 두 곳을 오갈 때입니다. 저는 그 오가는 비용을 없애는 쪽으로 정리했고, 지금 쓰고 있는 다리 세 개를 그대로 옮깁니다.
잘하는 일이 서로 다릅니다
탐색기가 빠른 상황이 분명히 있습니다. 처음 열어 보는 폴더를 훑을 때, 파일 이름이 기억나지 않을 때, 사진이나 PDF 를 눌러 확인할 때입니다. 눈으로 보고 마우스로 집으면 끝나는 일에는 명령을 만들 이유가 없습니다.
터미널이 이기는 상황은 성격이 다릅니다. 같은 일을 두 번째로 할 때, 조건을 걸어야 할 때(확장자가 이것인 것만, 어제 이후에 바뀐 것만), 무엇을 했는지 남겨야 할 때입니다.
그래서 기준은 질문 하나로 정리됩니다. 다음에 또 할 일인가. 한 번으로 끝날 일이면 탐색기가 빠르고, 또 할 일이면 터미널에서 이름을 붙여 남기는 편이 낫습니다. 탐색기에서 한 일은 아무 흔적이 없어서, 다음 달에 같은 일을 하려면 처음부터 다시 눌러야 합니다.
문제는 한 가지 일이 두 쪽에 걸쳐 있을 때입니다. 로그 파일 스무 개 중 어제 것만 골라 메일에 붙이는 일이 그렇습니다. 고르는 것은 터미널이 압도적으로 빠르고, 메일 창에 넣는 것은 클립보드나 마우스가 필요합니다. 이럴 때 사람들은 탐색기를 다시 열고 파일을 눈으로 찾기 시작합니다. 그 왕복을 없애는 것이 아래 세 개입니다.
터미널에서 탐색기로 건너가기
첫째는 지금 있는 폴더를 그대로 탐색기 창으로 여는 것입니다. 한 줄이면 됩니다.
alias exp='start "" "$(pwd)"'
cd 로 이미 깊이 들어와 있는 폴더를 탐색기에서 다시 찾아 들어가는 일이 없어집니다.
둘째는 파일을 터미널에서 고르고, 그 결과를 클립보드에 파일로 올리는 것입니다. 글자가 아니라 파일 자체가 올라가므로, 탐색기나 메일 작성 창에서 Ctrl+V 하면 그대로 붙습니다.
fcp() {
local w=()
for f in "$@"; do [ -e "$f" ] && w+=("'$(cygpath -aw "$f")'"); done
[ ${#w[@]} -eq 0 ] && { echo "fcp: no files" >&2; return 1; }
local list; list=$(IFS=,; echo "${w[*]}")
powershell -NoProfile -Command "Set-Clipboard -Path @($list)"
}
cygpath -aw 가 Git Bash 경로를 윈도우 경로로 바꿔주는 부분이 핵심입니다. PowerShell 은 /tmp/a.txt 를 알아듣지 못합니다. 실제로 무엇이 올라갔는지 확인해 보면 이렇습니다.
$ fcp a.txt b.txt
$ # 클립보드에 들어간 것
C:\Users\dualk\AppData\Local\Temp\src\a.txt
C:\Users\dualk\AppData\Local\Temp\src\b.txt
이제 앞의 예시가 한 줄이 됩니다. fcp $(ls -t *.log | head -5) 로 최근 로그 다섯 개를 올리고 메일 창에서 붙여넣으면 끝입니다.
탐색기에서 터미널로 건너오기
반대 방향은 두 가지입니다. 폴더째로 옮겨오는 것과 파일을 가져오는 것입니다.
폴더는 우클릭 메뉴가 가장 짧습니다. 탐색기에서 폴더를 오른쪽 버튼으로 누르면 Open WezTerm here, Open Git Bash here 같은 항목이 있고, 누르면 그 폴더에서 터미널이 열립니다. Git Bash 쪽은 Git 을 설치할 때 자동으로 등록됩니다. 제 레지스트리에 들어 있는 명령은 이렇습니다.
Directory\shell\git_shell
"C:\Program Files\Git\git-bash.exe" "--cd=%1"
Directory\shell\Open WezTerm here
"C:\Program Files\WezTerm\wezterm-gui.exe" start --cwd "%V\"
여기서 알아둘 것이 하나 있습니다. 폴더를 우클릭할 때와 폴더 안 빈 곳을 우클릭할 때 읽는 자리가 다릅니다. 앞은 Directory\shell, 뒤는 Directory\Background\shell 입니다. 한쪽에만 등록된 프로그램은 어떤 때는 메뉴에 나오고 어떤 때는 안 나옵니다. Windows 11 이면 우클릭 메뉴가 짧게 나오므로 "더 많은 옵션 표시" 를 누르거나 Shift+F10 으로 전체 메뉴를 봐야 합니다.
파일을 가져오는 쪽이 fpaste 입니다. 탐색기에서 Ctrl+C 를 누른 뒤 터미널에서 부르면 지금 폴더로 복사됩니다.
fpaste() {
powershell -NoProfile -Command "Add-Type -A System.Windows.Forms; [Windows.Forms.Clipboard]::GetFileDropList() | ForEach-Object { \$_ }" |
tr -d "\r" | while IFS= read -r f; do
[ -n "$f" ] && cp -r "$(cygpath -u "$f")" "${1:-.}" && echo "pasted: $(basename "$f")"
done
}
GetFileDropList 가 클립보드에 담긴 파일 목록을 꺼내고, cygpath -u 가 윈도우 경로를 다시 Git Bash 경로로 되돌립니다. 공백이 들어간 파일 이름도 그대로 넘어옵니다.
$ fpaste
pasted: a b.txt
pasted: c.txt
fcp 와 fpaste 에는 짧은 별칭을 하나씩 더 달아두면 손이 먼저 기억합니다. 저는 ccp 와 ccv 로 뒀습니다. Ctrl+C 와 Ctrl+V 를 그대로 옮긴 이름입니다.
정리
| 방향 | 명령 | 하는 일 |
|---|---|---|
| 터미널 → 탐색기 | exp | 지금 폴더를 탐색기 창으로 엽니다 |
| 터미널 → 어디든 | fcp 파일… | 고른 파일을 클립보드에 올립니다 |
| 탐색기 → 터미널 | 폴더 우클릭 | Open WezTerm here 로 그 폴더에서 터미널을 엽니다 |
| 탐색기 → 터미널 | fpaste | Ctrl+C 한 파일을 지금 폴더로 가져옵니다 |
탐색기와 터미널은 경쟁 관계가 아닙니다. 한 번으로 끝날 일은 탐색기가 빠르고, 또 할 일은 터미널에 이름을 붙여 남기는 편이 낫습니다. 남는 문제는 둘 사이를 오가는 비용이고, 그것은 위의 세 줄로 거의 사라집니다.
셋 중 하나만 골라 넣으신다면 exp 를 권합니다. 한 줄이고, 넣은 그날부터 탐색기에서 폴더를 찾아 들어가는 일이 없어집니다.
