2016-02-28 43 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被附加到目标文件,以形成符号链接名称,作为一个例子。)

相关问题