Как создать символическую ссылку, которая открывает (буквально) целевой файл

Предположим, у меня есть файл 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 .

4 Solutions collect form web for “Как создать символическую ссылку, которая открывает (буквально) целевой файл”

Нет. Но вы можете создать оболочку libreoffice, которая примет каждый аргумент, который является символической ссылкой, и превратит его в $(readlink -f $the_symlink) . Затем вы можете настроить файловый менеджер на открытие файлов libreoffice через эту оболочку.

lowrapper:

 #!/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 будет открывать целевые ссылки вместо ссылок.

Вы не можете, но вместо этого вы можете создать символические ссылки в вашем каталоге «foo» следующим образом:

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

Затем добавьте «root» в начало всех ваших гиперссылок. Теперь, если вы откроете свой документ из «.», «Root» будет разрешен в «foo /.», А ваш «root / baz.txt» будет разрешен в «foo /./ baz.txt». Если он открывается из самого «foo», тот же «root / baz.txt» будет разрешен в «./baz.txt», потому что «root» указывает на «.».

Я не думаю, что есть способ сделать именно то, о чем вы просите. Символы – это файловые системы. Тем не менее, может возникнуть достойное обходное решение, если вы создадите небольшой скрипт, который откроет ссылку вместо ссылки:

 #!/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 в обычном файле просто возвращает имя файла, поэтому это также будет работать для не-ссылок.

Я закончил несколько иной подход, создав новый тип файла – назовем его «sim (ilt) link» – который содержит (относительный) путь к файлу, который должен быть открыт, а затем создал скрипт do иметь дело с этим.

Рассмотрим следующий сценарий:

 ./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 в файловом менеджере (как объясняется в ответе Тердона). В конце концов, вам нужно будет создать тип mime для файлов .odl и связать его со сценарием (в этом случае не было этого шага в моем случае, но связал все текстовые файлы со сценарием, что было явно нежелательно).

Почему я предпочел эту альтернативу тем, которые были предоставлены PSkocik и terdon, хотя они отлично работают? По трем причинам:

  • Не все мои .odt файлы (и ссылки на них) имеют такую ​​структуру, что я должен открыть их «в каталоге целевого файла». Таким образом, я влияю на процедуру открытия только интересующих файлов.

  • Системные регулярные символические ссылки будут работать независимо от настроек на моем текущем компьютере. Это означает, что если мне удастся открыть один из этих файлов на компьютере, на котором я не изменил настройки для открытия файлов .odt с помощью своего сценария, он все равно откроется, и я могу случайно портить пути своих гиперссылок внутри. Таким образом, если компьютер не настроен на открытие файлов .odl , они просто не будут работать, и мне придется напрямую обращаться к целевым файлам.

  • Наконец, в случае, если я перемещаю или переименовываю некоторые из каталогов, я могу легко найти и заменить файлы .odl чтобы исправить пути. (Это, вероятно, также возможно с символическими ссылками, но кажется несколько сложнее).

Предостережения: Я думаю, что это будет работать только для хорошо сформированного, не избыточного, относительного пути, указанного в файле .odl . Вероятно, есть способ сделать что-то более надежно в том смысле, что он будет работать также с абсолютным путем или с относительным путем с некоторой избыточностью в нем.

Linux и Unix - лучшая ОС в мире.