2010-05-13 62 views
1

舉例來說,我想我有一個包含以下文件夾如何爲當前目錄中具有相同名稱但下劃線用破折號替換的每個目錄建立符號鏈接?

foo_bar 
baz 

我想有一個bash命令,這將使一個符號鏈接foo-barfoo_bar一個目錄,以便它看起來像這樣:

foo-bar 
foo_bar 
baz 

我敢肯定,我可以寫一個Python腳本來做到這一點,但我很好奇,如果有一種方法使用bash做到這一點。這裏就是我堅持:

ls -1 | grep _ | xargs -I {} ln -s {} `{} | sed 's/_/-/'` 

我試圖做的是運行命令ln -s的第一個參數是目錄名,第二個參數是該名稱通過sed s/_/-/通過。有沒有另一種方法來做到這一點?

回答

5

Bash可以在字符串替換!

for path in *_*; do [ -d "$path" ] && ln -s "$path" "${path//_/-}"; done 

如果你想更好地選擇哪些應用它,你可以做同樣的事情:

find . -type d [other tests...] | while read path; do [ -d "$path" ] && ln -s "$path" "${path//_/-}"; done 

或者您ls ... | grep ...當然代替find

字符串處理,包括取代一個有用的參考:Manipulating Strings

+0

哇;我不知道這一點。我一直在打電話給sed。 =] – strager 2010-05-13 22:58:12

+0

@strager:sed顯然要強大得多。這只是字面字符串替換,而不是正則表達式。但是,當這就是你需要的時候,避免產生額外的過程是很好的! – Cascabel 2010-05-14 03:16:25

2

我不建議parsing ls,但這裏是你如何使用它sed和「xargs`做你想做什麼(如果有文件名中的空格,將無法正常工作):

ls *_* | sed 'h;s/_/-/g;x;G;s/\n/ /' | xargs ln -s 

不過,我會做的方式Jefromi顯示。

相關問題