2016-02-28 88 views
2

我正在編寫一個bash shell腳本(適用於RH和Solaris),它使用openssl創建散列符號鏈接到同一目錄內的所有證書。我有大約130個證書,並且在添加新證書時,我希望腳本僅爲新證書創建符號鏈接。我可能不得不求助於刪除所有符號鏈接並重新創建它們,但是如果有一個不太困難的方法來執行此操作,這比刪除全部並重新創建更可取。如何檢查文件是否有符號鏈接

我知道如何找到符號鏈接的所有文件:

find . -lname '*.cer' 

find . -type l -printf '%p -> %l\n' 

但我不知道如何在否定或發現這個結果的逆對或其他循環。我想查找當前目錄中缺少符號鏈接的所有文件。

謝謝!

+0

找到所有的文件,找到具有符號鏈接的所有文件,找到的差異。 –

+0

循環遍歷每個文件,檢查是否存在關聯的鏈接,如果沒有,則創建鏈接。您還需要提供其他信息,如示例文件名和示例鏈接名稱,以提供它們之間的關聯(如果有)。這也可能提供另一種識別需要鏈接的文件的方式。 –

+0

[如何檢查符號鏈接是否存在]的可能重複(http://stackoverflow.com/questions/5767062/how-to-check-if-symlink-exists)。從問題和答案看,你似乎想在Bash中測試'-e'和'!-h'。 – jww

回答

0
$ ls -srlt 
example1.png 
example.png -> ../example.png 

$ find . -type f -print 
./example1.png 

$ find . ! -type f -print 
. 
./example.png 
1

假設GNUfind(其使用我從你使用的失範行爲-printf的推斷),以下命令將輸出所有的名字當前目錄中不是位於sam中的符號鏈接目標的文件Ë目錄

comm -23 <(find . -maxdepth 1 -type f -printf '%f\n' | sort) \ 
     <(find . -maxdepth 1 -lname '*' -printf '%l\n' | sort) 

注:這是假設的符號鏈接都用單純的文件名爲目標定義。
另外,GNUfind不排序輸出,所以需要明確的sort命令。

您可以在shell循環中處理生成的文件以創建所需的符號鏈接。

comm -23 <(find . -maxdepth 1 -type f -printf '%f\n' | sort) \ 
     <(find . -maxdepth 1 -lname '*' -printf '%l\n' | sort) | 
    while IFS= read -r name; do ln -s "$name" "${name}l"; done 

(在上面的命令,l被附加到目標文件,以形成符號鏈接名稱,作爲一個例子。)

相關問題