(文字通り)ターゲットファイルを開くシンボリックリンクを作成する方法

(文字通り)ターゲットファイルを開くシンボリックリンクを作成する方法

bar.txtディレクトリにファイルがあり、toを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.txtLibreOfficeの観点から相対パスが間違っています。以前に作成されたハイパーリンクは機能せず、(もちろん比喩的に)ハイパーリンクを作成すると元にbaz.txtなりますbar.txt

答え1

いいえ。しかし、シンボリックリンクの各パラメータを取得し、それを$(readlink -f $the_symlink)

ローラッパー:

#!/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ファイルのハンドラをからに変更すると、libreofficelibreofficelowrapperリンクの代わりにリンク先を開きます。

答え2

これはできませんが、次のように "foo"ディレクトリへのシンボリックリンクを作成できます。

./foo
./foo/root -> .
./root -> foo/.

次に、すべてのハイパーリンクの先頭に「root」を追加します。 「.」で文書を開くと、「root」は「foo/.」と確認され、「root/baz.txt」は「foo/./baz.txt」と確認されます。 「root」が「.」を指しているため、同じ「root/baz.txt」が「foo」自体で開かれると、「./baz.txt」と解析されます。

答え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 Link」を意味します。 「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が提供する選択肢よりもこの選択肢を好むのはなぜですか? 3つの理由:

  • すべての.odtファイル(および対応するリンク)がこの構造を持っているわけではありません。 「ターゲットファイルのディレクトリで」を開く必要があります。これは、関心のあるファイルを開くプロセスにのみ影響します。

  • システム汎用シンボリックリンクは、現在のコンピュータ設定に関係なく機能します。つまり、スクリプトを使用してファイルを開くための設定を変更していないコンピュータでこれらのファイルのいずれかを開くと、そのファイルは.odtとにかく開いて誤ってその中のハイパーリンクパスを台無しにする可能性があります。これにより、コンピュータがファイル.odlを開くように設定されていない場合は機能しなくなり、ターゲットファイルを直接見つける必要があります。

  • 最後に、関連ディレクトリの一部を移動したり名前を変更したりすると、ファイルを簡単に検索して置き換えることで.odlパスを変更できます。 (これはシンボリックリンクでも可能ですが、少し難しいようです。)

注意:これはうまく構造化され、重複しない場合にのみ適用されると思います。比較的ファイルに指定されたパス.odl。いくつかの冗長性を持つ絶対パスまたは相対パスを使用することもできます。

関連情報