美文网首页
Windows路径转成Linux子系统的路径

Windows路径转成Linux子系统的路径

作者: 水木的编程那些事儿 | 来源:发表于2021-07-16 09:59 被阅读0次

    需求说明

    自己用的是windows电脑,也开启了windows下面的linux子系统,有时候需要在linux子系统里面操作一些文件,而这些文件的路径是windows形式,windows路径是使用的反斜杠符号\,而linux则使用的是斜杠/,在路径特别长的时候一个个的去修改这两个符号会很麻烦;
    另一方面,在linux子系统里面,windows下面的CDE盘是挂载在/mnt盘下面的,如下图所示:

    image.png

    这里的cde分别对应于windows里的CDE盘,举个例子,在windows里面的目录是C:\Users\asus,那么对应于linux里面该目录就是/mnt/c/Users/asus,要是一个个去修改的话确实很麻烦,因此我决定写一个shell脚本,对windows路径做一些简单的处理,将其转成linux路径,也正好借此机会学习一下shell里面变量替换的相关操作。

    代码实现

    在写代码之前需要搞清楚需求要点。

    我们的windows路径是C:\Users\asus\Anaconda3,其对应的linux路径是/mnt/c/Users/asus/Anaconda3,将windows路径转换成linux路径需要做如下操作:

    1. win路径中的冒号需要去掉
    2. win路径中的C需要变成小写的c;
    3. 需要在win路径前面加上/mnt/;
    4. 需要将反斜杠\换成斜杠/;

    下面是具体代码:

    # usage: bash win2linux_path.sh "C:\Users\asus\Anaconda3"
    
    win_path=$1 # 脚本的第一个参数就是windows路径
    #win_path="C:\Users\asus\Anaconda3" # 一个示例路径
    
    tmp_path=${win_path/:/} # 将冒号删掉
    tmp_path=${tmp_path//\\/\/} # 将\\替换为/
    
    disk_id=${tmp_path:0:1} # 取出第一个字母,也就是C盘的C,冒号后面第一个0指的是从下标为0的地方开始提取,第二个冒号后面的1表示提取一个字母
    disk_id=$(echo $disk_id | tr [:upper:] [:lower:]) # 大写转小写
    #echo $disk_id
    
    other_path=${tmp_path:1} # 路径中除了磁盘以外的部分
    
    linux_path="/mnt/"${disk_id}${other_path} # 需要将/mnt/接在路径最前方
    echo "windows path is "${win_path}
    echo "linux path is "${linux_path}
    

    将以上代码存入到win2linux_path.sh脚本中,使用方法为:

    bash win2linux_path.sh "C:\Users\asus\Anaconda3" 
    

    需要注意的是这里的参数需要加双引号,因为linux里面反斜杠表示转义,不加双引号的话反斜杠无法传入到变量中。

    输出如下:

    windows path is C:\Users\asus\Anaconda3
    linux path is /mnt/c/Users/asus/Anaconda3
    

    大功告成!

    代码中的要点总结

    下面对上面代码中的关键点做一下总结。

    1. 变量的字符串替换

    有两种形式:

    1. ${var/a/b}:将var变量中第一次出现的a替换成b
    2. ${var//a/b}:将var变量中所有的a替换成b

    举个例子:

    var="hello linux, I love programming"
    echo "raw text is "$var
    
    var1=${var/hello/hi} # 将hello替换成hi
    echo "var1 is "$var1 # 输出var1的值,这里用到的是字符串连接操作,直接将两个字符串并排放着就可以。
    
    var2=${var/o/111} # 将第一次出现的o替换成111
    echo "var2 is "$var2
    
    var3=${var//o/111} # 将所有的o替换成111
    echo "var3 is "$var3
    

    上面的输出如下:

    raw text is hello linux, I love programming
    var1 is hi linux, I love programming
    var2 is hell111 linux, I love programming
    var3 is hell111 linux, I l111ve pr111gramming
    

    2. 字符串的下标使用

    上面的代码中需要将windows路径里面的磁盘号取出来(也就是C:\Users\asus中的C),里面用到了字符串的下标操作,注意linux里面的字符串下标是从0开始的(好像只有R语言的下标是从1开始的?记不得还有哪些语言的下标是从1开始的了)。

    使用形式:${var:offset:length},其中offset指的是从下标offset开始往后截取,一直取length个字符,如果不指定length,那么将从offset一直取到最后一个字符。

    举个例子:

    var="123456"
    echo ${var:0:2} # 从0开始截取2个字符,输出12
    echo ${var:2:4} # 从下标2开始截取4个字符,输出3456
    echo ${var:3} # 从下标3开始截取到字符串的最后,输出456
    

    相关文章

      网友评论

          本文标题:Windows路径转成Linux子系统的路径

          本文链接:https://www.haomeiwen.com/subject/ooivpltx.html