2017-01-31 33 views
1

在MacOSX中,可以在Finder中創建一個名稱中包含正斜槓「/」的文件夾。

我試圖bash腳本做類似的東西一樣來

args=("[email protected]") 
name=${args[0]} 
street_corner=${args[1]} 
my_folder="Hello ${name} - ${streetcorner}" 
mk() { 
    case "$1" in /*) :;; *) set -- "./$1";; esac 
    mkdir -p "$1" 
} 
mk $my_folder 

其中街角是交叉的格式爲「街1 /街頭2」,因此需要的斜線被保存在目錄名稱。

我讀several articles like this one他們解釋瞭如何操縱字符串以便在您自己設置字符串時轉義或保持向前。我遇到的問題是用戶傳遞參數在腳本中使用,因此當我運行該命令來創建一個以$ my_folder作爲參數的目錄時,字符串已經被封裝。

如何擴展street_corner的值而不讓正斜槓創建名爲「street 2」的子目錄位於目錄「street 1」內,而是創建一個名爲「street 1/street 2」的目錄?

我嘗試了這些修復和故障

street_corner="${args[0]}" 
my_folder='"Hello ${name} - ${streetcorner}"' 
my_folder="'Hello ${name} - ${streetcorner}'" 
my_folder="Hello ${name} - ${'streetcorner'}" 
my_folder="Hello ${name} - ${$"streetcorner"}" 
my_folder="Hello "${name}" - "${streetcorner} 

而且還試圖給出street_corner輸入像

./my_script.sh "name" "street 1\/street 2" 
./my_script.sh "name" 'street 1/street 2' 
./my_script.sh "name" "'street 1/street 2'" 

回答

0

在腳本中,你需要雙引號的右側行:

name="${args[0]}" 
street_corner="${args[1]}" 

和命令:

mk "$my_folder" 

此外還有一個錯字。從street_corner中刪除下劃線。

然後調用腳本是這樣的:

./my_script.sh "name" "street 1\/street 2" 

./my_script.sh "name" 'street 1/street 2' 
1

你的問題不是引用的一個。

正斜槓是UNIX類型操作系統中的路徑分隔符。它幾乎是文件名中唯一不能擁有的字符(儘管它可以是路徑的一部分,它允許表示目錄層次結構)。你可以有空格,製表符,甚至是換行符。但沒有前傾斜線。

所以答案是,你不能使用street1/street2作爲文件名,而不能將street1解釋爲目錄以外的任何東西。

4

涉及/:的路徑名(下面將討論的原因)在macOS下有點混淆。簡短回答如下:

  • 您不能在文件名中使用/
  • 由於歷史原因,Finder假裝您可以
  • 也出於歷史原因,Finder假裝您不能使用:

首先,/是不是在POSIX路徑名有效的字符;它被保留爲路徑分量分隔符。將有效文件名稱作爲參數的命令行工具將拒絕那些包含/的文件。

取景器出現讓你創建一個文件或文件夾名稱中包含/,但它靜靜的/轉換爲:。你可以從終端確認這一點。在您的主目錄中創建一個名爲foo/bar的文件夾;如果您從終端運行ls,它將顯示爲foo:bar


其次,:是歷史用作經典的Mac OS路徑分隔符。 Finder仍然不允許創建名稱包含:的文件夾,但命令行工具(如mkdir)可以創建。 mkdir foo:bar將起作用,並且該名稱在Finder中將顯示爲foo/bar

+0

因此,您需要將streetcorner中的斜線轉換爲文件名中的冒號。這應該工作:'my_folder =「Hello $ {name} - $ {streetcorner // \ //:}」。你可以在花括號中讀到這樣的混亂:streetcorner變量的值('streetcorner')與所有出現的(''''''斜槓字符''''''' - 注意它被轉義了,所以它不會是誤認爲是分隔符)替換爲('/')冒號(':')。 –

+0

感謝@chepner和@ gordon-davisson! =) – Discofan