[英]How to check if file has a symlink
我正在編寫一個bash shell腳本(用於RH和Solaris),它使用openssl為同一目錄中的所有證書創建哈希符號鏈接。 我有大約130個證書,當添加新證書時,我希望腳本只為新證書創建符號鏈接。 我可能不得不求助於刪除所有符號鏈接並重新創建它們,但如果有一個不那么困難的方法來執行此操作; 這比刪除所有並重新創建更可取。
我知道如何使用符號鏈接查找所有文件:
find . -lname '*.cer'
要么
find . -type l -printf '%p -> %l\n'
但我不確定如何在for或其他循環中否定或找到此結果的反轉。 我想找到當前目錄中缺少符號鏈接的所有文件。
謝謝!
假設GNU find
(我使用非標准動作-printf
推斷其使用),以下命令將輸出當前目錄中不是位於同一目錄中的符號鏈接目標的所有文件的名稱 :
comm -23 <(find . -maxdepth 1 -type f -printf '%f\n' | sort) \
<(find . -maxdepth 1 -lname '*' -printf '%l\n' | sort)
注意:這假定符號鏈接定義為僅使用文件名作為目標。
此外, GNU find
不對輸出進行排序,因此需要顯式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
作為示例附加到目標文件名以形成符號鏈接名稱。)
$ ls -srlt
example1.png
example.png -> ../example.png
$ find . -type f -print
./example1.png
$ find . ! -type f -print
.
./example.png
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.