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

5
我是一个有用的助手,可以为您翻译文本。
我正在编写一份bash shell脚本(适用于RH和Solaris),使用openssl在同一目录下创建哈希符号链接证书。我大约有130个证书,当添加新证书时,我希望脚本仅为新证书创建符号链接。我可能不得不删除所有符号链接并重新创建它们,但如果有一种不那么复杂的方法来做到这一点,那将比删除所有内容并重新创建更可取。
我知道如何查找所有具有符号链接的文件:
find . -lname '*.cer'

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

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

谢谢!


查找所有文件,查找所有带符号链接的文件,查找差异。 - n. m.
循环遍历每个文件,检查是否有关联的链接,如果没有,则创建链接。您还需要提供其他信息,如示例文件名和示例链接名称,以提供它们之间(如果有)的相关性。这也可以提供另一种识别需要链接的文件的方法。 - David C. Rankin
可能是如何检查符号链接是否存在的重复问题。从问题和答案中可以看出,您想在Bash中测试-e!-h两个条件。 - jww
2个回答

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

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

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

2

假设您使用的是非标准操作-printf,那么可以使用GNUfind命令来输出当前目录中所有文件的名称,这些文件不是在同一目录下符号链接的目标。

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被添加到目标文件名以形成符号链接名称,这只是一个例子。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接