我改变了目录名称。 在这个目录中有数千个文件。 有些项目使用这个文件,项目有符号链接。
如果只有2 bash脚本删除和创build新的 – 我会做到这一点,但可能是你知道更简单的方法吗?
通过前缀词计数行和组
追加到前几行的开始和结束
如何在单个文本文件中将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;' ;
保持它们的相对性是可能的,但只是付出很大的努力。
打破了
对于那些关心单线地狱实际上意味着什么的人:
-type l – 匹配符号链接
-execdir – 对于每个匹配,在匹配的文件的目录中运行以下命令:
bash – 呃,bash
-c – 执行以下字符串(前导和尾随'删除):
p="$(readlink "{}")"; – 从最内在的开始:
" – 启动一个字符串以确保不会发生扩展
" – 结束字符串
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 :
'...' – 需要,因为我们在一个'引号字符串
then – 然后…
"'"$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 举报,一经查实,本站将立刻删除。