【问题标题】:Bash - broken symlinksBash - 损坏的符号链接
【发布时间】:2015-04-19 20:52:24
【问题描述】:

我在 Debian 下编写 bash 脚本时遇到了麻烦。我有一个包含更多文件夹和文件的文件夹(它是一个文件夹树)。此树包含符号链接。我想递归地遍历整个结构,检测损坏的符号链接并以这种方式(绝对路径)打印它们(不是它们的目标,而是链接本身):

/tmp/Foo/Bar/symlink1
/tmp/Foo/symlink2
/tmp/Foo/Goo/symlink3

但我不想也不能使用经典

find -L $(path) -type l

因为它遵循给定结构之外的正确链接并检测结构之外的损坏链接,我不希望在我的打印输出中出现这些,因为我只想检测 $(path) 中给出的结构内部损坏的符号链接和所有它的子目录。你能帮帮我吗?我觉得这需要一些带有 readlink 和一些循环的黑魔法,但我不知道怎么做。谢谢你的建议! :)

【问题讨论】:

  • 我不熟悉-F。它有什么作用?
  • find -F $(path) -type l => 跟随符号链接(取消引用符号链接并替换为引用的文件或目录),当它不能被跟随时 -type l 被执行并测试文件是否是符号链接。如果是,则打印出来。
  • find 的哪个变体或版本支持-F
  • 噢,对不起……我的意思是-L,该死的,我真的很累……-L……我的意思是找到-L
  • 除了麻烦之外,FooBar 之后的下一个变量应该是 Baz 而不是 Goo。 :-)

标签: linux bash unix debian symlink


【解决方案1】:

以下命令将在不使用符号链接的情况下完成这项工作:

find /tmp/ -type l -printf '%p|' -exec stat -L {} \; 2>&1 | grep 'No such' | cut -d'|' -f1

stat-L 选项通过检查其后面的文件来跟踪链接(但是不要将其与find-L 选项混淆)。找不到链接时,会出现错误:

stat: cannot stat `./symlink': No such file or directory

但是,我们也想打印文件名,所以我们使用-printf '%p|'。这里的管道仅用作分隔符(我怀疑您的文件名称中包含管道),以将文件名与将打印的 stat 错误分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多