Linux 파일 경로로 변환 된 Windows 파일 경로


13

bash 변수에 Windows 경로가 문자열로 있습니다.

file='C:\Users\abcd\Downloads\testingFile.log'

이 경로를로 시작하는 Linux 경로로 변환하려고합니다 /c/Users....

내 시도

다음과 같이 작동합니다.

file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log

문제

여기서는 파일 경로가 포함 된 문자열에 대해이 작업을 수행했습니다. 이 질문을하는 이유는 Ubuntu 16.04의 bash 스크립트에서 20 개의 문자열을 변환해야하기 때문에 변환 할 때마다 2 줄을 작성해야하기 때문에 많은 공간을 차지하고 있기 때문입니다!

질문

두 명령을 결합하는 방법이 있습니까

file=${file/C://c}
file=${file//\\//}

하나의 명령으로?


1
for 루프 (어쩌면 배열)를 사용하십시오. 또한 변수를 인용하십시오.
wjandrea

감사. 루프 또는 배열에서이를 수행하는 방법의 예를 보여줄 수 있습니까?
edesz

답변:


17

을 사용하여 한 번에 두 가지 교체를 수행하는 방법이 sed있지만 반드시 그럴 필요는 없습니다.

이 문제를 해결하는 방법은 다음과 같습니다.

  1. 파일 이름을 배열에 넣습니다
  2. 배열을 반복

filenames=(
  'C:\Users\abcd\Downloads\testingFile.log'
  # ... add more here ...
)

for f in "${filenames[@]}"; do
  f="${f/C://c}"
  f="${f//\\//}"
  echo "$f"
done

인쇄하지 않고 출력을 배열에 넣으려면 echo행을 할당으로 바꾸십시오 .

  filenames_out+=( "$f" )

나는이 개 파일이 있다면 Ok.But f1하고 f2, 어떻게 그 일이 것? 이전 파일 이름을 바꾸어 새 파일 이름을 배열에 어떻게 다시 할당합니까?
edesz

@WR은 em을 새 배열에 넣고 사용합니다.
muru

@WR 답변에 추가
wjandrea

1
명확성을 기하기 위해 새로운 배열을 만드는 것이 좋습니다.
wjandrea

9

여러 번 수행하고 싶은 것이 있다면 작은 쉘 함수를 작성해보십시오.

win2lin () { f="${1/C://c}"; printf '%s\n' "${f//\\//}"; }

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ win2lin "$file"
/c/Users/abcd/Downloads/testingFile.log
$ 
$ file='C:\Users\pqrs\Documents\foobar'
$ win2lin "$file"
/c/Users/pqrs/Documents/foobar

나쁜 생각이 아닙니다. 그러나 그것은 /c/Users...주는 것이 아닌 대신주는 것 C:\Users\...입니다.
edesz

@WR 죄송합니다-복사하여 붙여 넣기 오류가 발생했습니다. 지금 시도하십시오.
steeldriver

1
고마워, 나는 cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }Linux 용 Windows 하위 시스템에서 사용 하며 매력처럼 작동합니다!
주말

2

sed를 사용하여 한 줄로 이것을 달성 할 수 있습니다.

file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\\|/|g')"

그럼에도 불구하고 두 패턴은 서로 다른 대체물로 대체되기 때문에 별도로 유지되어야합니다.


1
동의어 :file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
wjandrea

1

이 질문이 여전히 새로운 제안에 열려 있습니까? 그렇다면 도움이 되겠습니까?

$ file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '\\' '/')"
$ echo $file
/C:/Users/abcd/Downloads/testingFile.log

아, 그리고 C를 소문자로 캐스트 해야하는 경우 :

file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '^C' 'c'|tr '\\' '/')"

개요로서 :

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ echo $file
C:\Users\abcd\Downloads\testingFile.log
$ file="/$(echo $file|tr '^C' 'c'|tr '\\' '/')"
$ echo $file
/c:/Users/abcd/Downloads/testingFile.log

사용 이유는 무엇입니까 '^C'?
edesz

1
^ 수단 그렇지 않으면 C의 모든 발행 수는 ... 소문자 될 것입니다 어떤이 있어야한다, 라인의 시작

다른 제안도 효과가 있다고 덧붙여 야합니다. 많은 Unix 명령이 동일한 작업을 수행 할 수 있으므로 원하는 스타일의 솔루션을 사용하십시오.

나는 ^여기에 다른 답변에도 사용 된 것에 대해 이전에 묻지 않았습니다. 답변과 설명에 감사드립니다.
edesz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.