2012-09-21 72 views
0

有人可以幫助創建一個符號鏈接,我將自己的字符串追加到鏈接的名稱?下面的代碼,我到目前爲止有:Linux符號鏈接追加名稱

find /home/folder1/*.txt -type f -exec ln -s {} \; 
find /home/folder2/*.txt -type f -exec ln -s {} \; 

這樣命令的工作創造我的符號鏈接,但我想添加自己的文本鏈接的名字,因爲我可以有每個文件夾中的文件名相同,並在目的地,我需要找到一種方法給符號鏈接賦予唯一的名稱。所以我在想創建符號鏈接看起來像這樣的:

folder1_doc1.txt 
folder2_doc1.txt 
folder1_doc2.txt 
folder2_doc2.txt 

我想這個腳本會是這個樣子:

find /home/folder1/*.txt -type f -exec ln -s {} "folder1_" +\; 
find /home/folder1/*.txt -type f -exec ln -s {} "folder2_" + \; 

回答

0

這裏有三個問題。

  1. 匹配文件的名稱是{}

  2. {}中的名稱是該文件的完整路徑(在您的案例中爲/home/folder1/a.txt)。你需要去掉所有文件,直到最後的/纔有文件名。一個解決方案是使用string manipulation並從那裏工作,爲什麼我們需要使用##的最大去除和*/的水珠要匹配:

    $ a="home/files/folder1/s"; echo $a ${a##*/} 
    home/files/folder1/s s 
    
  3. 不能使用{}一個${...}構造內。因此,我會以一個使用for和做同樣的事情更換您的find ... -exec ...命令:

    for file in `/home/folder1/*.txt`; do ln -s $file folder1_${file##*/}; done 
    

PS:還有basename可以用來代替${a##*/}但它仍然不能-exec使用部分爲find

0

您可以使用像awk這樣的流編輯器快速完成這樣的事情。嘗試例如爲:

find /home/folder1/*.txt -type f | awk -F '.txt' '{printf "ln -s %s %s_CUSTOM_TEXT.txt\n", $0, $1}' 

這將打印出一堆,可能是接近你想在終端輸入什麼命令。玩的AWK strink得到它說你想要什麼,然後管道結果SH:

find /home/folder1/*.txt -type f | awk -F '.txt' '{printf "ln -s %s %s_CUSTOM_TEXT.txt\n", $0, $1}' | sh 

做這樣的事情時要小心;確保你不要管一堆命令來證明你實際上並不想被執行!

+0

在完整的解決方案給出之前,您需要準確地決定自定義文本的內容。您所建議的問題是,如果子文件夾folder1具有相同名稱的文件,那麼它們將爲符號鏈接獲得相同的名稱。例如:/home/folder1/subfolder1/t.txt和/home/folder1/subfolder2/t.txt都會得到名爲folder1_t.txt的鏈接。一個簡單的解決方案是例如爲所有文本文件編號,從第一個到最後一個查找結果。 –