如何创建打开(字面意思)目标文件的符号链接

如何创建打开(字面意思)目标文件的符号链接

bar.txt假设我在目录中有一个文件foo并创建一个baz.txtfoo/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 文件的处理程序从 更改为libreofficelowrapper那么 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。可能有一种方法可以更稳健地完成任务,因为它也可以使用绝对路径或带有一些冗余的相对路径。

相关内容