Linux 또는 Ubuntu on Windows에서 file:///경로 형식으로 cd
브라우저에서 열람중인 로컬 파일이 있는 폴더에 간단하게 cd 하고 싶다…
이전에.
실제로 실행해 본 것이 이쪽의 스크린 샷.
Ubuntu on Windows에서 Windows의 전체 경로 이름으로 cd
이렇게 되면 브라우저에서 로컬 파일을 열고 있는 동안에 그 파일이 있는 디렉토리에서 작업하고 싶은 경우에 copipe로 cd 할 수 있는 것입니다.
이 스크린샷은 Bash on Ubuntu on Windows의 것입니다만, 이번 구현한 내용은 보통의 Linux에서도 사용할 수 있습니다. 자신의 손에서 Kali Linux에서 확인되었습니다.
구현
Windows의 패스명을 Ubuntu on Windows의 패스명으로 변환해 cd 하는 것은 이전의 구현으로 되어 있습니다만, 이번의 구현에서는 file:///[드라이브명]:/… 를 발견하면 Windows 의 패스명 상당으로 변환하는 처리를 덧붙입니다. 덧붙인다고 해도 이번 만드는 처리가 먼저 행해지도록 합니다.
그렇게 하는 것으로, 전회 작성한 부분이 거의 그대로 사용되게 합니다.
또한 file:///경로는 URL 인코딩된 문자를 포함할 수 있습니다. 예를 들어, "Program%20Files"라고. 이것은 당연히 디코딩되어야 한다.
이러한 처리와 이전에 구현된 처리의 조합으로 URL 형식의 file:///[드라이브명]:/… 과 Windows의 풀 패스 형식의 양쪽 모두를 Ubuntu on Windows 의 cd 로 이용할 수 있게 된다 입니다.
혹은, 모처럼이므로 file:///그리고 드라이브 편지를 포함하지 않는 경우도 취급할 수 있도록 해 봅시다. 그러면 이것은 같은 구현이 네이티브인 Linux 나 UNIX 환경에서도 사용할 수 있습니다. macOS의 터미널에서도 아마 움직일 것이다.
실제 구현 예는 여기입니다. 전회와 같이 .bashrc 당에 이것을 추기합니다.
.bashrc 등에 추가 내용# file:// や [drive_letter]:\... の入力文字列を UNIX のパス形式に変換する処理
__change_winpath2buwpath() {
newpath=""
local __inputpath="$1"
# https://regexper.com/#%5Efile%3A%5C%2F%5C%2F(%5C%2F((%5BA-Za-z%5D%3A)%3F%5BA-Za-z0-9%20%5C-%5C.%5C%25%5C%2F%5C~%5C(%5C)%5C%3A%5D*))(%5B%23%5C%3F%5D.*)%3F
if [[ $__inputpath =~ ^file:\/\/(\/(([A-Za-z]:)?[A-Za-z0-9 \-\.\%\/\~\(\)\:]*))([#\?].*)? ]]; then
if [ "${BASH_REMATCH[3]}" == "" ]; then
# 入力値がドライブレターを含まない file:/// のパス指定なら file:// と # 以降を削ってUNIXのフルパス相当にする
__inputpath=$( printf '%b' "${BASH_REMATCH[1]//%/\\x}")
else
# 入力値が file:///[A-Za-z]:/ のパス指定なら file:/// と # 以降を削ってWindowsのフルパス相当の文字列にする
__inputpath=$( printf '%b' "${BASH_REMATCH[2]//%/\\x}")
fi
fi
if [[ "$__inputpath" =~ ^([A-Za-z]):(.*) ]]; then
# 入力文字列が Windows のフルパスならば
# ドライブレターとディレクトリに分解する
local __windows_driveletter=${BASH_REMATCH[1],}
local __windows_path=${BASH_REMATCH[2]}
# ドライブレターとパスを含めて Ubuntu on Windows 上でのパスにする
# このときにドライブレターは小文字に変換し
# バックスラッシュをスラッシュに置換している
newpath="/mnt/${__windows_driveletter}${__windows_path//\\/\/}"
else
newpath="$__inputpath"
fi
}
__cd() {
if [ "$1" == "" ]; then
# パラメータが未指定の場合は cd コマンドをパラメータ無しで実行する
\cd
else
# Windowsのフルパスや file:/// を
# Ubuntu on Windows のパスに変換する処理
__change_winpath2buwpath "$1"
# 指定されたパスがファイルならば、そのファイルのディレクトリを取得する
# dirname で変換する方法もあるけれど、外部コマンドは極力避けたいので
# シェル変数の展開で後方最短パターンの削除を利用する
if [ -f "$newpath" ]; then
echo "${newpath} is file."
newpath=${newpath%/*}
echo "remap to ${newpath}"
fi
\cd "$newpath"
fi
}
# cd コマンドを __cd に置換する
alias cd=__cd
그 중 추가하는 처리
입력 값이 디렉토리가 아닌 파일에 대한 전체 경로 인 경우 파일이 존재하는 디렉토리에 대해 cd를 허용하면 더 유용 할 수 있습니다.
이것은 실제로 cd 하기 전에 -d 나 -f 로 패스를 검증해, 필요에 따라서 입력치로부터 파일명 부분을 깎기만 하기 때문에 깔끔하게 만들 수 있는 하즈.
상기는 실장 완료.
참고 자료
URL 인코딩된 문자열을 디코딩하는 처리는 아래 페이지의 내용을 참고로 했습니다.
Reference
이 문제에 관하여(Linux 또는 Ubuntu on Windows에서 file:///경로 형식으로 cd), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kazinoue/items/d023b80bcc1faa5e6486
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# file:// や [drive_letter]:\... の入力文字列を UNIX のパス形式に変換する処理
__change_winpath2buwpath() {
newpath=""
local __inputpath="$1"
# https://regexper.com/#%5Efile%3A%5C%2F%5C%2F(%5C%2F((%5BA-Za-z%5D%3A)%3F%5BA-Za-z0-9%20%5C-%5C.%5C%25%5C%2F%5C~%5C(%5C)%5C%3A%5D*))(%5B%23%5C%3F%5D.*)%3F
if [[ $__inputpath =~ ^file:\/\/(\/(([A-Za-z]:)?[A-Za-z0-9 \-\.\%\/\~\(\)\:]*))([#\?].*)? ]]; then
if [ "${BASH_REMATCH[3]}" == "" ]; then
# 入力値がドライブレターを含まない file:/// のパス指定なら file:// と # 以降を削ってUNIXのフルパス相当にする
__inputpath=$( printf '%b' "${BASH_REMATCH[1]//%/\\x}")
else
# 入力値が file:///[A-Za-z]:/ のパス指定なら file:/// と # 以降を削ってWindowsのフルパス相当の文字列にする
__inputpath=$( printf '%b' "${BASH_REMATCH[2]//%/\\x}")
fi
fi
if [[ "$__inputpath" =~ ^([A-Za-z]):(.*) ]]; then
# 入力文字列が Windows のフルパスならば
# ドライブレターとディレクトリに分解する
local __windows_driveletter=${BASH_REMATCH[1],}
local __windows_path=${BASH_REMATCH[2]}
# ドライブレターとパスを含めて Ubuntu on Windows 上でのパスにする
# このときにドライブレターは小文字に変換し
# バックスラッシュをスラッシュに置換している
newpath="/mnt/${__windows_driveletter}${__windows_path//\\/\/}"
else
newpath="$__inputpath"
fi
}
__cd() {
if [ "$1" == "" ]; then
# パラメータが未指定の場合は cd コマンドをパラメータ無しで実行する
\cd
else
# Windowsのフルパスや file:/// を
# Ubuntu on Windows のパスに変換する処理
__change_winpath2buwpath "$1"
# 指定されたパスがファイルならば、そのファイルのディレクトリを取得する
# dirname で変換する方法もあるけれど、外部コマンドは極力避けたいので
# シェル変数の展開で後方最短パターンの削除を利用する
if [ -f "$newpath" ]; then
echo "${newpath} is file."
newpath=${newpath%/*}
echo "remap to ${newpath}"
fi
\cd "$newpath"
fi
}
# cd コマンドを __cd に置換する
alias cd=__cd
Reference
이 문제에 관하여(Linux 또는 Ubuntu on Windows에서 file:///경로 형식으로 cd), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kazinoue/items/d023b80bcc1faa5e6486텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)