2012-11-27 128 views
2

我試圖從查找命令的結果中創建一個符號鏈接(軟鏈接)。我使用sed刪除文件名前面的./。我這樣做是爲了讓我可以將文件名粘貼到鏈接保存路徑的末尾。我正在使用Ubuntu Server 8.04進行這項工作。從查找中創建符號鏈接

我這個職位,這是一種解決我的問題的教訓,但不quite-

How do I selectively create symbolic links to specific files in another directory in LINUX?

產生的文件名沒有工作,雖然如此,我開始努力學習AWK然後決定sed。

我正在使用單線循環來完成此操作。問題在於循環的結構是分隔文件名,爲文件名中的每個單詞創建一個鏈接。有相當多的文件,我想自動化每個鏈接採取它鏈接文件的文件名的過程。

我很喜歡基本的bash命令,但我遠不是命令行專家。我用ls和awk開始了這個工作,然後開始尋找sed。我的sed語法可能會更好,但我已經在兩天內學會了這一點,現在我有點卡住了。

爲噸find -type f -name "*txt*" | sed -e 's/.//' -e 's$/$$'; do echo ln -s $t ../folder2/$t;

任何幫助或建議將不勝感激。謝謝。

+0

可以避開'/'從'輸出傳遞一個列表find'。的路徑。 'find */-options ...'我想這也可能有一個選項。 – tripleee

+0

非工作鏈接的問題是相對路徑名稱需要相對於鏈接目標。重寫以啓動循環一個目錄('find source -options ... -exec ln -s'{}'target \;'),使用絕對路徑或擴展您的'sed'腳本來解析相對於目的地(在前面添加「../ source /」)。 「ln -s」的第一個參數沒有以任何方式被重寫,它被逐字地用作符號鏈接的內容,沒有要求或檢查它在鏈接創建時解析爲現有文件。 – tripleee

+0

我想你是指'sed'%^ \ ./%%''。爲了允許在正則表達式中使用斜槓,'sed'允許你在's'命令之後使用任何標點符號,儘管斜線是傳統的默認分隔符,在'vi'和'ed'之前模仿了搜索字符它。或者,您可以反斜槓 - 將分隔符轉義爲在表達式中將其引用爲文字字符。 – tripleee

回答

2

執行你的循環是這樣的:

(IFS=$'\n'; for t in `find -type f -name "*txt*" | sed 's|.*/||'`; do ln -s $t ../folder2/$t; done) 

通過IFS設置爲僅換行,你應該能夠讀取整個文件名沒有在空間越來越分裂。

括號用於確保循環在子shell中執行,並且當前shell的IFS不會被更改。

+0

謝謝!這就是我一直在尋找的。我不確定我是否正確使用find和sed命令,並且幫助我瞭解需要進行必要更改的位置。在我的閱讀中,我看到我可以在sed中使用其他字符(即%)。我看到的例子使用$,所以我嘗試了它,它的工作。我會嘗試使用你的提示來修改我的sed語法,並希望得到這個工作。再次感謝。 – mark

6

更簡單:

轉到文件夾,你想擁有的文件,並做到:

find /path/with/files -type f -name "*txt*" -exec ln -s {} . ';'