2017-02-09 21 views
0

爲什麼rm -fR folderpath/*也沒有刪除folderpath。據我瞭解通配符a*意味着aa加上任意數量的字符。所以,folderpath/*意味着folderpath/folderpath/加上任何字符。所以,該命令也應該執行rm -fR folderpath/,這也應該導致刪除文件夾路徑。使用類似folderpath/*的通配符與folderpath /不匹配。爲什麼?

+0

在這種情況下,通配符是「shell globbing」,其中'*'與任何內容匹配,但不是** nothing ** _ - 它與正則表達式中的「*」不匹配,即匹配「零個或多個」... shell glob'*'與_zero_不匹配。 –

+0

路徑名擴展與模式匹配的工作方式稍有不同。 – chepner

+1

@StephenP這不完全正確。 'foo * bar'會匹配'foobar'。 – chepner

回答

0

因爲你只是刪除文件夾路徑裏面的「/」意味着。

使用

rm -rf folderpath 

,如果你想這一切了。

+0

我知道這一點。只是想知道爲什麼?因爲rm -fR文件夾路徑/刪除了整個文件夾。爲什麼rm的通配符表現不同? – christoph

1

這是因爲shell嘗試擴展通配符。試用ls

假設你有一個文件夾aaa有兩個子文件夾bbb1和和他們每個人的包含文件​​和ccc2。應該是這樣的:

└── aaa 
    ├── bbb1 
    │   ├── ccc1 
    │   └── ccc2 
    └── bbb2 
     ├── ccc1 
     └── ccc2 

讓我們來創建它們來進行測試:

mkdir -p aaa/bbb{1,2} 
touch aaa/bbb{1,2}/ccc{1,2} 

現在嘗試一下下面的命令告訴你:

ls aaa  # first 
ls aaa/  # second 
ls aaa/*  # third 

第一個命令顯示出的aaa內容,這是文件夾bbb1和。第二個命令也是這樣。

但第三個命令將擴展爲

ls aaa/bbb1 aaa/bbb2 

是的,它表明你喜歡預期bbb1和的內容,這兩者都是時間的文件​​和ccc2

我想表明:你的shell代替了*與給定的目錄(因爲所有文件和文件夾名稱匹配)的的所有文件(或文件夾)和aaa/bbb1 aaa/bbb2替換您的字符串aaa/*。但它確實不是擴大到aaa,因爲這將採取/*了。

1

在這一點上文檔還不清楚,但路徑名擴展與普通模式匹配有很小的差別。一旦匹配/,您必須匹配目錄中的至少一個條目,才能認爲整個模式匹配。因此,儘管/foo/*模式與字符串/foo/匹配,但它不匹配路徑/foo/

一種可能的解釋是/foo/*匹配文件/foo/,如果沒有文件,則匹配失敗。謹以此更好地詮釋,不過,如果

shopt -s dotglob 
ls /foo/* 

匹配/foo/./foo/..

也許想着它的正確的方法是,路徑擴展考慮的圖案/ -delimited序列,每個都必須的圖案作爲一個整體來匹配的東西匹配。

相關問題