微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改许多文件的符号链接path?

我改变了目录名称在这个目录中有数千个文件。 有些项目使用这个文件,项目有符号链接

如何find所有符号链接,其中有地址的文件名称

如何将所有此符号链接更改为自动模式下的另一个path?

如果只有2 bash脚本删除和创build新的 – 我会做到这一点,但可能是你知道更简单的方法吗?

通过前缀词计数行和组

我怎样才能循环访问一个目录,并获得每个txt文件的wc?

追加到前几行的开始和结束

如何在单个文本文件中将tiff图像编译为xyz坐标?

如何使用find创build子目录的副本

这有点复杂,但可以通过find , readlink ,检查符号链接是否相对, sed在路径名中删除.. (从这个答案复制1:1)。

(请注意,由于符号链接目标不再存在,所以最方便的方法(如readlink -f )不可用。

假设你的旧路径是/var/lib/old/path :

oldpath='/var/lib/old/path'; find / -type l -execdir bash -c 'p="$(readlink "{}")"; if [ "${p:0:1}" != "/" ]; then p="$(echo "$(pwd)/$p" | sed -e "s|/./|/|g" -e ":a" -e "s|/[^/]*/../|/|" -e "ta")"; fi; if [ "${p:0:'${#oldpath}'}" == "'"$oldpath"'" ]; then ...; fi;' ;

现在用ln -sf ( -f覆盖现有的链接)替换上面的...

假设你的新路径是/usr/local/my/awesome/new/path :

oldpath='/var/lib/old/path'; newpath='/usr/local/my/awesome/new/path'; find / -type l -execdir bash -c 'p="$(readlink "{}")"; if [ "${p:0:1}" != "/" ]; then p="$(echo "$(pwd)/$p" | sed -e "s|/./|/|g" -e ":a" -e "s|/[^/]*/../|/|" -e "ta")"; fi; if [ "${p:0:'${#oldpath}'}" == "'"$oldpath"'" ]; then ln -sf "'"$newpath"'${p:'${#oldpath}'}" "{}"; fi;' ;

请注意, oldpath和newpath必须是绝对路径

另外请注意,这会将所有相关符号链接转换为绝对链接

保持它们的相对性是可能的,但只是付出很大的努力。

打破了

对于那些关心单线地狱实际上意味着什么的人:

find一个很酷的可执行文件

/ – 在这里搜索系统根目录

-type l – 匹配符号链接

-execdir – 对于每个匹配,在匹配的文件的目录中运行以下命令:

bash – 呃,bash

-c – 执行以下字符串(前导和尾随'删除):

p="$(readlink "{}")"; – 从最内在的开始:

" – 启动一个字符串以确保不会发生扩展

{} – 匹配文件名的占位符( -execdir功能

" – 结束字符串

readlink ... – 找出符号链接指向的地方

p="$(...)" – 并将结果存储在$p

if [ "${p:0:1}" != "/" ]; then if [ "${p:0:1}" != "/" ]; then – 如果$p的第一个字符是/ (即符号链接是绝对的),那么…

p="$(echo "$(pwd)/$p" | sed -e "s|/./|/|g" -e ":a" -e "s|/[^/]*/../|/|" -e "ta")"; – 将路径转换为绝对路径

$(pwd) – 当前目录(匹配的文件所在的位置,因为我们使用-execdir )

/$p – 将斜杠和符号链接的目标追加到工作目录的路径中

echo "$(pwd)/$p" | – 将上述内容传送给下一个命令

sed ... – 解决所有..的,看到这里

p="$(...)"并将结果存回$p 。

fi; – if结束

if [ "${p:0:'${#oldpath}'}" == "'"$oldpath"'" ]; – 如果$p以$oldpath

${p:0:'${#oldpath}'} – $p子字符串,从位置0开始,长度为$oldpath

${#oldpath} – 变量$oldpath长度

'...' – 需要,因为我们在一个'引号字符串

then – 然后…

ln -sf – 象征性地链接并覆盖现有的文件,参数:

"'"$newpath"'${p:'${#oldpath}'}" – 用$newpath替换$p的$oldpath部分(实际上从$p删除很多字符,就像$oldpath long一样, $newpath ):

" – 开始一个字符串

' – 结束' -string参数到bash -c

" – 附加一个" -string(在哪个变量扩展发生),包含:

$newpath – $newpath的值

" – 结束" -string参数bash -c

' – 附加一个'字符串,其中包含:

${p: – ${p:一个子串,起始于:

' – 结束bash -c的参数

${#oldpath} – 将$oldpath的长度附加到它

' – 附加另一个'字符串

} – 结束子字符串

" – 结束字符串

"{}" – 链接文件的路径保持不变

fi; – if结束

; – -execdir分隔符

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐