如何检查文件是否有符号链接

时间:2016-02-28 13:49:29

标签: bash symlink

我正在编写一个bash shell脚本(对于RH和Solaris),它使用openssl为同一目录中的所有证书创建哈希符号链接。我有大约130个证书,当添加新证书时,我希望脚本只为新证书创建符号链接。我可能不得不求助于删除所有符号链接并重新创建它们,但如果有一个不那么困难的方法来执行此操作;这比删除所有并重新创建更好。

我知道如何使用符号链接查找所有文件:

find . -lname '*.cer'

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

但我不确定如何在for或其他循环中否定或找到此结果的反转。我想找到当前目录中缺少符号链接的所有文件。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

假设 GNU find(我使用非标准动作-printf推断其用途),以下命令将输出所有文件的名称当前目录不是位于同一目录中的符号链接的目标

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

注意:这假定符号链接定义时使用 mere filename 作为目标。
此外, 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被附加到目标文件名以形成符号链接名称。)