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"
————————————————
