2011-02-01 104 views
2

我有一個目錄,/original,有數百個文件。我有一個腳本會一次處理一個文件,並刪除該文件,以便在腳本被中斷時不會再執行。所以,我需要一些到/original/processing上的文件的軟鏈接。下面是我的嘗試:如何爲目錄中的每個文件創建軟鏈接?

 
find /original -name "*.processme" -exec echo ln -s {} $(basename {}) \; 

,並得到類似:

 
ln -s /original/1.processme /original/1.processme 
ln -s /original/2.processme /original/2.processme 
ln -s /original/3.processme /original/3.processme 
... 

我想是這樣的:

 
ln -s /original/1.processme 1.processme 
ln -s /original/2.processme 2.processme 
ln -s /original/3.processme 3.processme 
... 

看來,$(basename)運行{}轉換之前。有沒有辦法解決這個問題?如果不是,我還能如何實現我的目標?

+0

`basename`只運行一次;看到一個解釋http://stackoverflow.com/questions/4793892/recursively-rename-files-using-find-and-sed/4794313#4794313 – 2011-02-01 15:43:38

回答

2

怎麼樣 -

ln -s $(echo /original/*.processme) . 
+0

它的工作原理,但它可能溢出,因爲我得到更多的文件。 – User1 2011-02-01 15:51:28

5

find /original -name '*.processme' -exec echo ln -s {} . \;

特別感謝瑞安奧貝羅伊幫助我意識到,我可以使用的.代替$(basename ...)

+0

應該是`'* .processme'`(單引號),以便您不會匹配當前目錄中剩下的任何文件。 – mark4o 2011-02-01 15:58:46

+0

好抓。我改變了它。 – User1 2011-02-01 16:28:42

6

您也可以使用cp(具體爲-s選項,它創建符號鏈接),例如。

find /original -name "*.processme" -print0 | xargs -0 cp -s --target-directory=. 
0

你只需要去除回聲和剝離文件路徑的重複和基本名稱完全

如果源文件夾是這個

ls -l /original 
total 3 
-rw-r--r-- 1 user user 345 Dec 17 21:17 1.processme 
-rw-r--r-- 1 user user 345 Dec 17 21:17 2.processme 
-rw-r--r-- 1 user user 345 Dec 17 21:17 3.processme 

然後

cd /processing 
find /original -name "*.processme" -exec ln -s '{}' \; 

應該產生

ls -l /processing 
total 3 
lrwxrwxrwx 1 user user 33 Dec 17 21:38 1.processme -> /original/1.processme 
lrwxrwxrwx 1 user user 33 Dec 17 21:38 2.processme -> /original/2.processme 
lrwxrwxrwx 1 user user 33 Dec 17 21:38 3.processme -> /original/3.processme 

意識到OP是從5年前開始的,對於那些尋求像我自己一樣的解決方案的人來說,在我解決問題之前,

相關問題