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 인코딩된 문자열을 디코딩하는 처리는 아래 페이지의 내용을 참고로 했습니다.

좋은 웹페이지 즐겨찾기