![如何创建打开(字面意思)目标文件的符号链接](https://linux22.com/image/10384/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E6%89%93%E5%BC%80%EF%BC%88%E5%AD%97%E9%9D%A2%E6%84%8F%E6%80%9D%EF%BC%89%E7%9B%AE%E6%A0%87%E6%96%87%E4%BB%B6%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5.png)
bar.txt
假设我在目录中有一个文件foo
并创建一个baz.txt
到foo/bar.txt
.喜欢:
./foo
./foo/bar.txt
./baz.txt -> foo/bar.txt
如果我打开baz.txt
我的编辑器会认为baz.txt
是在目录中打开的.
。有没有办法创建一个链接,以便bar.txt
(字面意思)打开?
上下文(或者为什么我尝试这样做):我有一个目录,其中包含大量文件,我在.odt
保留在同一目录中的文件中对这些文件进行索引和注释。在此.odt
文件中,我创建了指向目录中索引文件的超链接,以便我可以轻松访问具有(更多)上下文而不仅仅是文件名的各个文件。我将 LibreOffice 设置为将超链接保存为相对路径,以便这些链接可以在我的所有计算机上运行,而这些计算机并不总是与我的用户文件具有相同的目录树。
我想创建此.odt
文件的符号链接(或等效项),但是(就上面的示例而言)如果链接打开,baz.txt
则相对路径(从 LibreOffice 的角度来看)将是错误的。以前创建的超链接将不起作用,如果我碰巧在(当然,象征性的)中创建超链接,baz.txt
它将在原始bar.txt
.
答案1
不。但是您可以创建一个 libreoffice 包装器,它将采用符号链接的每个参数并将其转换为$(readlink -f $the_symlink)
.然后,您可以将文件管理器设置为通过该包装器打开 libreoffice 文件。
低说唱歌手:
#!/bin/bash -e
args=()
for a; do
case $a in
-*) args+=("$a");; #skip flags (your file names don't start with -, right?)
*) if ! [ -L "$a" ]; then #not a link
args+=("$a")
else #link => target
args+=( "$( readlink -f "$a")" )
fi
;;
esac
done
libreoffice "${args[@]}"
现在,如果您chmod +x lowrapper
将其放在 PATH 的某个目录中,然后将 libreoffice 文件的处理程序从 更改为libreoffice
,lowrapper
那么 libreoffice 将打开链接目标而不是链接。
答案2
你不能,但你可以做的是创建到“foo”目录的符号链接,如下所示:
./foo
./foo/root -> .
./root -> foo/.
然后将“root”附加到所有超链接的开头。现在,如果您从“.”打开文档,“root”将解析为“foo/.”,而您的“root/baz.txt”将解析为“foo/./baz.txt”。如果从“foo”本身打开,相同的“root/baz.txt”将被解析为“./baz.txt”,因为“root”指向“.”。
答案3
我认为没有任何方法可以完全满足您的要求。符号链接是文件系统结构。但是,如果您创建一个打开链接目标而不是链接的小脚本,可能会有一个不错的解决方法:
#!/bin/bash
i=0
declare -a targets
for file in "$@"; do
targets[$i]="$(readlink -f "$file")"
((i++))
done
libreoffice "${targets[@]}"
将其保存在您的 中PATH
,例如~/bin/openLink.sh
并使其可执行:
chmod a+x ~/bin/openLink.sh`
现在,打开文件管理器(您提到的caja
),右键单击.odt
文件并选择“打开方式”=>“其他应用程序”:
单击“使用自定义命令”并将脚本放在那里:
最后,关闭所有内容。现在,每次您单击一个.odt
文件时,都会使用该包装器打开该文件,因此它应该打开目标目录中的所有链接。请注意,readlink -f
在常规文件上仅返回文件的名称,因此这也适用于非链接。
答案4
我最终采用了一种稍微不同的方法,创建一个新的文件类型 - 让我们称之为“sim(ulated)link” - 它包含要打开的文件的(相对)路径,然后创建一个脚本处理它。
考虑以下场景:
./dir1/dir11/foo.odt
./dir2/foo.odl
“odl”代表“OpenDocument 链接”。 “foo.odl”的内容是:
../dir1/dir11/foo.odt
然后,您可以创建以下脚本来打开*.odl
(改编自 terdon 的答案):
#!/bin/bash
declare -a targets
for file in "$@"; do
targets+=( "$(readlink -f "$( dirname "$file" )"/"$( <"$file" )")" )
done
libreoffice "${targets[@]}"
(如果您不想使用,readlink
因为如果指定的路径是符号链接,它将遵循链接,您可以简单地使用:)
#!/bin/bash
for file in "$@"; do
cd "$( dirname "$file" )"
libreoffice "$( <"$file" )"
done
然后,您可以将此脚本与.odl
文件管理器中的文件关联起来(如 terdon 的答案中所述)。最终,您必须为.odl
文件创建一个 mime 类型并将其与脚本关联(在我的情况下缺少此步骤有效,但将所有纯文本文件与脚本关联,这显然是不可取的)。
为什么我更喜欢这个替代方案而不是 PSkocik 和 terdon 提供的替代方案,尽管它们工作得很好?出于三个原因:
并非我的所有
.odt
文件(及其链接)都具有这种结构,我必须“在目标文件的目录中”打开它们。这样,我只影响感兴趣文件的打开过程。无论我当前计算机的设置如何,系统常规符号链接都将起作用。这意味着,如果我碰巧在一台计算机中打开其中一个文件,而我没有更改使用
.odt
脚本打开文件的设置,那么它无论如何都会打开,并且我可能会无意中弄乱其中超链接的路径。这样,如果计算机未设置为打开.odl
文件,它们就无法工作,我将不得不直接查找目标文件。最后,如果我移动或重命名涉及的某些目录,我可以轻松搜索和替换文件
.odl
以更正路径。 (这可能也可以通过符号链接实现,但似乎有点困难)。
注意事项:我认为这只适用于结构良好、非冗余的、相对的文件中给出的路径.odl
。可能有一种方法可以更稳健地完成任务,因为它也可以使用绝对路径或带有一些冗余的相对路径。