【问题标题】:Shellscript Looping Through All Files and adjusting symlinkShellscript循环遍历所有文件并调整符号链接
【发布时间】:2012-11-24 11:50:59
【问题描述】:

我试图在 iOS 上启动并运行 libetpan,但是他们的设置 shell 脚本似乎有问题(问题在此处detail 中有更多解释).. 但基本上我有一个很长的文件夹指向无处的符号链接列表,即

mhdriver_types.h -> ../../src/driver/implementation/mh/mhdriver_types.h

实际上应该是

mhdriver_types.h -> ../../../src/driver/implementation/mh/mhdriver_types.h 

我想编写一个 shell 脚本,循环遍历所有符号链接,删除每个符号链接,然后为它重新创建一个符号链接到同一个以前的目的地,只是更深一个子目录。基本上我在示例中对所有文件做了什么。 .

有什么想法吗?

【问题讨论】:

    标签: macos bash loops symlink


    【解决方案1】:

    试试:

    find $DIR_PATH -type l | while read x; do tgt=`readlink "$x"`; ln -sf ../$tgt $x; done
    

    【讨论】:

    • 我得到 find: 非法选项 -- t 找到: 非法选项 -- y 找到: 非法选项 -- p 找到: 非法选项 -- e 找到: l: 没有这样的文件或目录
    • 哦,我没有在描述中看到iOS... find 命令在iOS 上可能有不同的选项。
    • 我在 mac osx shell 中实现了这个.. 不是在 iOS 中.. 但无论如何,让我尝试不同的命令变体
    • 检查find手册;关于如何获取仅符号链接的列表。
    • 我只是got 正确答案.. 但我会为你的答案+1,因为我受到了它的启发.. 而且你看起来是个好人:)
    【解决方案2】:

    受 anishsane 的 answer 启发,我得到了这个有效的代码:

    for name in $(find . -type l); do
        tgt=`readlink "$name"`
        ln -sf ../$tgt
    done
    

    【讨论】:

    • 我通常避免使用for filename in $(command)。因为在最坏的情况下,当文件名包含空格时,它会失败。 while read 是更稳定的解决方案。 (就我个人而言,我之前也使用过for var in 语法。但现在改用while read 语法。:D)
    • 有趣.. 那么这次讨论中唯一失败的结局是:为什么你的代码不适合我?唯一的区别是while循环与for循环..让我做更多的挖掘,看看会发生什么:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2023-03-31
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    相关资源
    最近更新 更多