bar.txt
ディレクトリにファイルがあり、toを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
いいえ。しかし、シンボリックリンクの各パラメータを取得し、それを$(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ファイルのハンドラをからに変更すると、libreofficelibreoffice
はlowrapper
リンクの代わりにリンク先を開きます。
答え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
。いくつかの冗長性を持つ絶対パスまたは相対パスを使用することもできます。