Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법 - 두 번째 이야기
예전에 쓴 글이 있었는데요,
Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법
; https://www.sysnet.pe.kr/2/0/13484
"C:\Program Files\Git\usr\bin" 바이너리가 없는 PC에서 실행하려고 pwd.exe와 그것의 실행에 필요한 DLL 3개(msys-2.0.dll, msys-iconv-2.dll, msys-intl-8.dll)을 복사했는데, 결과가 이상하게 나옵니다. ^^;
c:\test> dir /b
msys-2.0.dll
msys-iconv-2.dll
msys-intl-8.dll
pwd.exe
c:\test> pwd
/test
실행은 되는데, 원래 의도한 결과는 "/c/test"였지만 그냥 "/test"입니다. 뭔가 동적으로 의존성이 더 있는 것 같은데, 귀찮군요. ^^
그냥 아예 배치 스크립트로만 만들어 보기로 했습니다. 우선, 아래와 같이 pwd.bat 파일로 만들어 봤는데요,
@echo off
FOR /F %%I IN ("%0") DO SET CURRENT_DIR=%%~dpI
SET DIR_RESULT=%CURRENT_DIR:\=/%
REM https://stackoverflow.com/questions/17279114/split-path-and-take-last-folder-name-in-batch-script
for /f "delims=:/ tokens=1,*" %%A in ("%DIR_RESULT%") do (
set DRIVE_LETTER=%%A
set REST_PART=%%B
)
실행하면 이런 식으로 나옵니다.
C:\test> pwd
/C/test/
아쉽게도 "C" 드라이브 문자가 대문자로 나오는데요, 이 부분은 cd를 했을 때 소문자로 주면 해결은 됩니다.
// 현재 드라이브 문자가 대문자이지만, cd 명령어에 소문자로 주면,
C:\test> cd c:\temp
// 이후 소문자로 바뀜
c:\temp>
c:\temp> pwd
/c/temp/
그래도 유연하게 만들려면 그렇지 않은 경우까지 고려해야 하니, 스크립트 내에서 소문자로 바꾸는 것이 필요한데요, 그래서 이렇게 코드를 좀 더 수정할 수 있습니다.
@echo off
setlocal enabledelayedexpansion
FOR /F %%I IN ("%0") DO SET CURRENT_DIR=%%~dpI
SET DIR_RESULT=%CURRENT_DIR:\=/%
REM https://stackoverflow.com/questions/17279114/split-path-and-take-last-folder-name-in-batch-script
for /f "delims=:/ tokens=1,*" %%A in ("%DIR_RESULT%") do (
set DRIVE_LETTER=%%A
set REST_PART=%%B
)
REM https://stackoverflow.com/questions/284776/how-to-convert-the-value-of-username-to-lowercase-within-a-windows-batch-scrip
set _LOWER_DRIVE_LETTER=%DRIVE_LETTER%
set _UCASE=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set _LCASE=abcdefghijklmnopqrstuvwxyz
for /l %%a in (0,1,25) do (
call set _FROM=%%_UCASE:~%%a,1%%
call set _TO=%%_LCASE:~%%a,1%%
call set _LOWER_DRIVE_LETTER=%%_LOWER_DRIVE_LETTER:!_FROM!=!_TO!%%
)
SET PWDC_PATH=/%_LOWER_DRIVE_LETTER%/%REST_PART%
echo %PWDC_PATH%
소문자로 바꾸는 과정이 좀 난잡하지만 ^^ 그래도 어차피 자주 바꿀 코드는 아니기 때문에 실행이 잘 되므로 넘어갈 수 있습니다.
C:\Users\testusr\sample> pwd
/c/Users/testusr/sample/
따라서, 이제 /mnt 처리와 클립보드 복사 처리만 해주면
지난번 것과 완전히 동일한 기능을 합니다. ^^
...[생략]...
SET PWDC_PATH=/mnt/%_LOWER_DRIVE_LETTER%/%REST_PART%
echo %PWDC_PATH% | clip
echo Copied to the clipboard: %PWDC_PATH%
참고로, "/c/temp" 이런 식으로 바뀐 경로는 docker run의 "-v" 볼륨 연결하는 경로를 지정할 때도 사용할 수 있습니다.
// 윈도우 경로를 전달해도 되지만,
docker build -t net8_ubuntu18_build -f https://raw.githubusercontent.com/stjeong/sample_docker_script/main/dockerfile.ubuntu18.net8 .
docker run -v c:\temp:/app --name test-instance --rm -it net8_ubuntu18_build /bin/bash
// 이렇게 /c/temp를 전달해 동작
docker run -v /c/temp:/app --name test-instance --rm -it net8_ubuntu18_build /bin/bash
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]