【问题标题】:How to check if file has a symlink如何检查文件是否有符号链接
【发布时间】:2016-02-28 13:49:28
【问题描述】:

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

我知道如何找到所有带有符号链接的文件:

find . -lname '*.cer'

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

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

谢谢!

【问题讨论】:

  • 查找所有文件,查找所有带符号链接的文件,找出差异。
  • 循环遍历每个文件,检查是否有关联的链接,如果没有,创建链接。您还需要提供其他信息,例如示例文件名和示例链接名称,以提供它们之间的关联(如果有)。这也可能提供另一种识别需要链接的文件的方法。
  • How to check if symlink exists 的可能重复项。从问题和答案来看,您似乎想在 Bash 中同时测试 -e!-h

标签: bash symlink


【解决方案1】:
$ ls -srlt
example1.png
example.png -> ../example.png

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

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

【讨论】:

    【解决方案2】:

    假设 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 被附加到目标文件名以形成符号链接名称。)

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2011-08-11
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2014-06-08
      • 2023-04-03
      • 2019-04-05
      相关资源
      最近更新 更多