1、
命令使用时路径存在空格、特殊符号(如-、@等等)如何处理呢?
再如可以转义的字符包括:"?"(问号), "*"(星号), " "(空格), "$"(货币符), "&"(逻辑符), "( )"(英文括号)等等。
很早之前应该是遇到过这种问题,也处理过该问题,但是不记得怎么处理的了,也没找到自己以前处理过的博客,那就简记下吧。
(1)Linux路径约定
在Linux下可以使用长文件名和目录名,可以给它们取任何名称,但是必须遵守以下规则:
☆除了/外,所有的字符都可以;
☆有些字符最好不用,如空格符、制表符、退格符和以下字符:? @ # $ & ( ) \ | ' ' " " 等(其中,/ 号已经在第一条被严格禁止了,()是英文括号);
☆避免使用+-或.作为普通文件名的第一个字符(在Linux下以.开头的文件是属于隐藏文件);
☆和Windows文件命名不一样的是,在Linux下文件名大小写敏感。
☆另外,尽量避免使用中文和中文符号;
(2)路径处理遇到的问题及解决办法
比如说路径:
/home/ubuntu/zgd/firmwareExtracted/Foscam/_04914e2d4148d741fbfc4ff073a24e38bf675452.zip.extrac0--for 1.14.1.14 version only.zip.extracted/_FI9805W_app_ver1.14.0.17.bin.extracted/_0.extracttracted/app/bin
那么想进入此路径目录下,执行
cd /home/ubuntu/zgd/firmwareExtracted/Foscam/_04914e2d4148d741fbfc4ff073a24e38bf675452.zip.extrac0--for 1.14.1.14 version only.zip.extracted/_FI9805W_app_ver1.14.0.17.bin.extracted/_0.extracttracted/app/bin
会报错无此文件或文件夹,如下图所示:
解决办法是路径加上一个双引号。然后就ok了。如下面所示:
方法一:(推荐使用,方法简单可行)
cd “/home/ubuntu/zgd/firmwareExtracted/Foscam/_04914e2d4148d741fbfc4ff073a24e38bf675452.zip.extrac0--for 1.14.1.14 version only.zip.extracted/_FI9805W_app_ver1.14.0.17.bin.extracted/_0.extracttracted/app/bin”
方法二:(貌似不能行)
看到有的博客说在路径前面加上--就能解决问题,然后我尝试了一下,发现仍然会出现这种报错问题。
方法三:(可行,但有些麻烦)
将每一个存在特殊符号的位置,都使用转义符“\”进行转义。这种方法也是ok的,只是存在一个问题是,你不知道你的列表里是否包含了所有不能处理的特殊字符。我的列表里就很少字符。所以不是很建议采用此种方法。
special_symbol = ["?", "*", "@", "#", "$", "&", "%", "(", ")", " ", ""]
方法四:(可行,麻烦程度较方法三更高)
用双引号包含某段带有非法字符的路径片段
例如,打开 Program Files (x86) 文件夹:
1
$ cd Program" Files (x86)"
这种方法非常灵活,双引号使用次数不限,只要成对出现即可,终端会对引号内容照单全收。
例如,打开 Program Files (x86)/Adobe/Adobe Photoshop CS6 文件夹,你还可以这样:
1
$ cd Pro"gram Fi"les" (x86)/Adobe""/Adobe "Photo"shop C"S6
这条指令间断、或不间断地使用了4次双引号,只要保证所有空格和括号都被包括在成对的双引号范围内,文件夹都能正常打开。
总结一下:最好最快速的方法:在linux下处理路径的时候,如果遇到一些特殊符号,执行命令出错的时候,那就使用双引号“”进行处理一下就ok了。
————————————————
2、
当路径变量包含空格时,直接使用会出错
$ pwd
/home/test/Desktop/中文 空格1/English space2/混合——1_1 空 格 3
$ DIR="/home/test/Desktop/中文 空格1/English space2/混合——1_1 空 格 3"
例如,直接cd到这个有空格的路径变量是不行的
cheng@cheng:~/Desktop$ cd $DIR
bash: cd: 参数太多
情况1:当外层无引号时,路径变量加上引号就行啦
比如,把cd 后面的path变量用引号引起来就好了
cheng@cheng:~/Desktop$ cd "$DIR"
cheng@cheng:~/Desktop/中文 空格1/English space2/混合——1_1 空 格 3$
比如,把cd 后面的path变量用引号引起来就好了
当外层没有引号,只能"$DIR" ,不能\"$DIR\",否则会报错:
cheng@cheng:~/Desktop$ sudo dpkg -i \"$DIR\"/apps/xxxx-4.2.1-arm64.deb
dpkg: 错误: 无法访问归档 '"/home/test/Desktop/中文 ': 没有那个文件或目录
cheng@cheng:~/Desktop$ sudo dpkg -i "$DIR"/apps/xxxx4.2.1-arm64.deb
cheng@cheng:~/Desktop$ sudo dpkg -i "$DIR"/apps/xxxx-4.2.1-arm64.deb
情况2:当外层有引号时,加引号并转义或者加单引号
方法1:路径变量加双引号并转义
echo 'rootpassword'|su -c "dpkg -i \"$DIR\"/apps/xxx.deb"
方法2:路径变量加单引号
echo 'rootpassword'|su -c "dpkg -i '$DIR'/apps/xxx.deb"
————————————————