我有一条路说=========================
在此路径中,我有脚本文件说: Files1.sh Files2.sh Flles3.sh ....
每个脚本文件都有一行说来
export DATABASE_XML = / mnt / nfs / lin_work_live / linear_work / dexter / Deamon / Test2 / RDB.xml
================================================ ====== 假设第一个路径(即/ nfs / old_home / dexter / work / Deamon / Test2 /)具有此RDB.xml文件和该脚本文件中给定的路径,即 导出DATABASE_XML = ** / mnt / nfs / lin_work_live / linear_work / dexter / Deamon / Test2 / ** RDB.xml 是链接路径。
因此,如果我将脚本文件从 / nfs / old_home / dexter / work / Deamon / Test2 / IN /到/ nfs / old_home / dexter / work / Deamon / Test3 / IN /,因此它应该读取/ nfs / old_home / dexter / work的RDB.xml文件/ Deamon / Test3 /目录,而不是Test2..in,用一个简单的单词表示脚本内的路径 导出DATABASE_XML = / mnt / nfs / lin_work_live / linear_work / dexter / Deamon / Test2 /RDB.xml 应该更改为Test3,此更改也应反映在我移动的所有File1.sh ... FileN.sh文件中。 希望现在已经清楚了吗?
答案 0 :(得分:1)
/orig
中有一些文件
/orig/conf
/orig/IN/script1
.. /orig/IN/scriptN
export VAR="/orig-sym/conf"
/orig-sym
是指向/orig
的符号链接/new
/orig/conf
移至/new/conf
/orig/IN/scriptX
移至/new/IN/scriptX
export VAR="/new-sym/conf"
/new-sym
是指向/new
的符号链接在文件scriptX
被移动后进行搜索并替换。
可以使用类似sed -i s/find/replace/ file*
的方法,但是必须注意确保replace
不包含特殊的字符(例如/
,[
等)。安全地引用这些内容可能会很复杂。
但是,我们可以回避该问题。例如,使用shell和perl:
$ mkdir "/new"
$ ln -s "/new" "/new-sym"
$ cp -R "/orig/." "/new"
$ perl -i -pe '
BEGIN { $replacement = shift }
s/^(export VAR)=.*/$1="$replacment"/
' "/new-sym" "/new/IN/"script*
/new-sym
)-i
覆盖文件BEGIN
复制了新路径,避免了复杂的转义s///
执行替换
请勿使用绝对路径。
由于配置文件始终是脚本的上一级,因此不需要更改相对路径。
如果脚本直接执行,则$0
应包含其路径。
因此,在许多情况下,类似这样的方法将起作用:
#!/bin/sh
# scriptX
# ...
# commands that must not include "cd", "pushd", etc
# ...
top=$(dirname -- "$0")
absolute_top=$(CDPATH= cd -- "$top" && pwd -P)
# ...
# commands that may include "cd", "pushd", etc
# ...
export VAR="$(absolute_top)/../conf