[英]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.