Windows Ubuntu Bash에 대한 Windows 경로 변환


31

Windows Ubuntu Bash를 사용하는 Windows 배치 스크립트가 있습니다. 인수로 전체 Windows 경로를 수신 한 다음 해당 경로를 Ubuntu Bash의 명령으로 전달합니다.

@echo off
bash -lic 'ffmpeg -i "%1" output.avi'

다음 "%1"은 전체 Windows 경로입니다."C:\some path\file.avi"

명령은 오류를 제공합니다.

C:some pathfile.avi: Protocol not found

이 Windows 경로를 /mnt/c/some\ path/file.aviWindows Bash가 실제로 이해할 수있는 경로로 변환하려면 어떻게해야합니까?


당신이 모든 발행 수를 대체 필요 C:/mnt/c(잠재적으로 너무 다른 드라이브 문자에 대한), 맞죠?
kleinfreund

답변:


41

Windows Build 17046 [1] 에는 wslpathWSL / Windows 와의 경로를 변환 할 수있는 새로운 유틸리티가 포함되어 있습니다 . WSL 기능이없는 것으로 알려져 있습니다. [2]

사용법 예 :

$ echo $0
/bin/bash

$ which wslpath
/bin/wslpath

$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
/mnt/c/aaa/bbb/ccc/foo.zip

wslpathWindows의 Powershell에서 전화 할 수 있습니다 .

>>> wsl wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
/mnt/c/aaa/bbb/ccc/foo.zip

wslpath 옵션 및 매개 변수 :

-a    force result to absolute path format
-u    translate from a Windows path to a WSL path (default)
-w    translate from a WSL path to a Windows path
-m    translate from a WSL path to a Windows path, with ‘/’ instead of ‘\\’

1
이전 Windows의 경우 여기에서 사용할 수 있습니다. github.com/laurent22/wslpath
Warlike Chimpanzee

1
posh는 '\'를 탈출해야하지만 wsl은 필요하지 않습니다. 당신의 예는 $ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'해야 $ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'탈출 할 때 그것은 작동하지만 쓸모없는 이스케이프가 혼동됩니다. 탈출해야한다고 가정 할 수 있습니다. 또한, 나는 생각에 대한 설명을 -m, ... with ‘/’ instead of ‘\\’'\'를해야한다 (내가 아는 그것의 복사 붙여 넣기) 당신이 할 경우 wslpath -w /mnt/c/Users, 그것은 '\\'이 인쇄되지 않습니다
papo

1
나는 그 생각 wslpath이다 일부 해답의,하지만 난이 게시물은 기능적으로 질문에 대답하지 않는 것을 생각 - 배치 파일은 Windows 스타일 (이 경우, 요청 C:\foo\bar\blah그것이 WSL 명령에 대한 실행 않는 방법을 데이터 파일에 대한) 이름을 그 파일?
스콧

@papo 나는 usescaped 슬래시 문제에 우연히 빠져 들었습니다. 일관되지 않고 실행 방법에 달려 있습니다 .Powershell에서 실행할 때 이스케이프 처리되지 않은 슬래시가 생략되고 bash에서 실행할 때 문자열 내부에서만 올바르게 처리됩니다.
수크 멜

@sukhmel true, wsl (Windows의 bash가 실행되는 경우) 및 cmd 콘솔에서 작은 따옴표 또는 큰 따옴표로 경로를 넣거나 \\로 이스케이프하십시오. 따옴표 안에 이스케이프 처리하는 것이 필요하지 않은 빠른 방법을 제공합니다 cat `wslpath '. 콘솔에 파일을 제출하고 다음 줄을 완료하십시오.'`
papo

5

나는 이것을하기 위해 박쥐 파일을 썼다. 작업 할 때마다 파일을 배치하거나 경로에 추가하십시오 (또는 작업하기 쉬운 코드 위에 놓기 만하면 됨). 먼저 파일 경로에 "변수"를 할당하십시오 (별도의 파일을 사용하는 경우 매개 변수를 사용해보십시오).

코드가하는 일 :

1) 경로의 첫 글자 인 드라이브를 가져옵니다.

2) 처음 두 글자를 제거하십시오.

3) 슬래시를 변경하십시오.

4) 이것은 까다로운 부분입니다. Linux는 대소 문자를 구분하므로 대문자 드라이브 문자를 소문자로 변환해야합니다. 각각을 일치시킴으로써이를 수행하십시오 (더 나은 방법이 있으면 알려주십시오). 드라이브가 10 개를 초과하지 않기 때문에 불필요한 드라이브 문자도 제거 할 수 있습니다.

5) 모든 것을 결합하여 최종 줄을 제공하십시오.

결과:

입력:

E:\myfiles\app1\data\file.csv

출력 (따옴표 포함) :

"/mnt/e/myfiles/app1/data/file.csv"

코드는 다음과 같습니다.

@echo OFF

set "variable=E:\myfiles\app1\data\file.csv"

set "drive=%variable:~0,1%"

set variable=%variable:~2%
set "variable=%variable:\=/%"

if %drive%==A set "drive=a"
if %drive%==B set "drive=b"
if %drive%==C set "drive=c"
if %drive%==D set "drive=d"
if %drive%==E set "drive=e"
if %drive%==F set "drive=f"
if %drive%==G set "drive=g"
if %drive%==H set "drive=h"
if %drive%==I set "drive=i"
if %drive%==J set "drive=j"
if %drive%==K set "drive=k"
if %drive%==L set "drive=l"
if %drive%==M set "drive=m"
if %drive%==N set "drive=n"
if %drive%==O set "drive=o"
if %drive%==P set "drive=p"
if %drive%==Q set "drive=q"
if %drive%==R set "drive=r"
if %drive%==S set "drive=s"
if %drive%==T set "drive=t"
if %drive%==U set "drive=u"
if %drive%==V set "drive=v"
if %drive%==W set "drive=w"
if %drive%==X set "drive=x"
if %drive%==Y set "drive=y"
if %drive%==Z set "drive=z"

set "variable=/mnt/%drive%%variable%"

echo "%variable%"

@echo ON

반대로 쉘 스크립트에서 유닉스 경로를 Windows 경로로 변환하는 것은 어떻습니까?
JacobTheDev

@JacobTheDev, 당신은 약간의 수정이 필요합니다;)
PulseJet


0

왜 그렇게 복잡한가?

레지스트리 항목 변경

HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command

...에서

C:\Windows\System32\wsl.exe "%1"

C:\Windows\System32\wsl.exe `wslpath '%1'`

wslpath 앞과 끝에 백틱을 사용하고 % 1 주위에 작은 따옴표 (직선 틱)를 사용하십시오.

나를 위해 작동합니다.


정말? 이것은 bash배치 파일에서 어디에서 호출되는 문제의 문제를 해결 합니다. (이 예제에서 bash의 첫 번째 인수는 작동 -lic하므로 어떻게 wslpath '%1'작동 하는지 명확하지 않습니다 .) 왜 큰 따옴표 ( "%1")에서 작은 따옴표 ( '%1')로 변경 했습니까?
스콧
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.