преобразуйте мягкий - в hardlinks с CP

Телефон должен быть базирован, чтобы иметь root пользовательская установка sudo (или любое другое приложение). Иначе это было бы установлено как "типичный" пользователь и не имело бы корневой доступ.

Что касается второго вопроса, однажды sudo установлен по внедренному телефону, по моему опыту, приложения, для которых нужен он просто, запрашивают это, и Вы получаете раскрывающуюся подсказку.

5
09.10.2013, 02:09
3 ответа

Пример на информационной странице показывает Вам как, хотя примеру немного трудно последовать:

$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
74161745 a
74161745 b

Давайте разломаем это на его команды компонента:

  • mkdir c; : создает каталог c/
  • : > a; : просто быстрый способ создать пустой файл. Это эквивалентно echo "" > a. : удар, созданный, в котором ничего не делает, видят help :.
  • ln -s a b : создайте softlink к a названный b. На данном этапе это содержание текущего каталога:

    $ ls -l | cc2ter 
    total 4
    -rw-r--r-- 1 terdon terdon    0 Oct  9 02:50 a
    lrwxrwxrwx 1 terdon terdon    1 Oct  9 02:50 b -> a
    drwxr-xr-x 2 terdon terdon 4096 Oct  9 02:50 c
    

    Отметьте это b символьная ссылка (гибкая ссылка), она не указывает на тот же inode как a:

    $ ls -i1c a b
    16647344 a
    16647362 b
    
  • cp -aH a b c; : файлы копии a и b в каталог c. Это - то, где преобразование происходит, опции передали cp :

    -a, --archive
          same as -dR --preserve=all
    -d    same as --no-dereference --preserve=links
    -H    follow command-line symbolic links in SOURCE
    

    -H необходимо потому что (от info cp):

    При копировании с символьной ссылки 'CP' обычно переходит по ссылке только если не копирование рекурсивно.

    С тех пор -a активирует рекурсивное копирование (-R), -H необходим, чтобы перейти по символьным ссылкам. -H средства, которые по ссылкам переходят несмотря на рекурсию и приведут к жестким ссылкам, сделанным в целевом каталоге. Это содержание c/ после последнего шага (первый столбец является inode числом):

    $ ls -li c 
    total 0
    17044704 -rw-r--r-- 2 terdon terdon 0 Oct  9 02:50 a
    17044704 -rw-r--r-- 2 terdon terdon 0 Oct  9 02:50 b
    

Теперь относительно того, как точно это работает, насколько я могу фигурировать из проигрывания вокруг с ним, cp --preserve=links объединенный с -L или -H преобразует символьные ссылки на жесткие ссылки, если и ссылка и цель будут скопированы в тот же каталог.


На самом деле, как узнанный OP, по крайней мере, в системах Debian, cp --preserve=links достаточно для преобразования символьных ссылок на жесткие ссылки, если целевой каталог является тем же.

5
27.01.2020, 20:37
  • 1
    По некоторым причинам это, кажется, работает без -H и/или -L. Во всяком случае: : > file было новым для меня и является большим! Также: Согласно философии UNIX [" … программы, которые делают одну вещь и делать это хорошо"], существует ln для создания ссылок. Но затем, почему бы не сделать это возможный и имеет смысл в рабочем процессе :) –  erch 09.10.2013, 15:44
  • 2
    @chirp ссылка будет скопирован без -H но это будет гибкая ссылка. Добавление -H заставляет его преобразовать в жесткую ссылку. –  terdon♦ 09.10.2013, 17:12
  • 3
    @chirp я просто попробовал точную команду от info страница с и без -H и каждый дал мне hardlink и другой символьная ссылка с другим inodes. Это был на ext4 выполнении файловой системы Debian и cp (GNU coreutils) 8.21. Вы действительно получаете различные результаты? Если Вы хотите отправить где-нибудь, проверьте с помощью ping-запросов меня в чате. –  terdon♦ 10.10.2013, 03:05
  • 4
    просто отправил отчет об ошибках в coreutils список рассылки на возможной ошибке в документации. –  erch 10.10.2013, 05:05
  • 5
    Как к вашему сведению, : также работы для ksh, csh, и OpenBSD sh (который является действительно на основе pdksh). –  kurtm 10.10.2013, 05:13

Я отправил отчет о возможной ошибке coreutils команде @gnu.org в info cp документация и получила этот ответ:

Документы являются немного краткими здесь. Основной вопрос - то, что-a подразумевает-d, и это подразумевает - нет - разыменовывают, который требуется, чтобы заставлять Ваши команды работать как ожидалось. Т.Е. - нет - разыменовывают, требуется, чтобы останавливать CP неявно после символьных ссылок в источнике.

Проверить и разделить деталь, продемонстрированную здесь:

$ mkdir links; : > a; ln -s a b;

Здесь мы видим, что-d переопределяет-H, как это прибывает после. Поэтому мы не разыменуем символьные ссылки во-первых.

$ rm links/*; cp -H -d a b links
$ l links/
lrwxrwxrwx. 1 padraig 1 Oct 10 09:37 b ▪▶ a
-rw-rw-r--. 1 padraig 0 Oct 10 09:37 a

Здесь мы видим, что-H теперь соблюдают, как он является последним, и поэтому символьные ссылки сопровождаются в источнике, приводящем к hardlinks в месте назначения.

$ rm links/*
$ rm links/*; cp -d -H a b links
$ l links
-rw-rw-r--. 2 padraig 0 Oct 10 09:37 b
-rw-rw-r--. 2 padraig 0 Oct 10 09:37 a

Я сделаю документы немного более явными со следующим:

diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index b273627..aeed4ca 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -8257,9 +8257,11 @@ $ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
 @noindent

Отметьте исходные данные: @file{b} символьная ссылка на регулярный файл @file{a}, все же файлы в целевом каталоге, @file{c/}, трудно связаны.

  • С тех пор @option{-a} подразумевает @option{--preserve=links}, и с тех пор @option{-H} говорит @command{cp} для разыменования параметров командной строки это видит два файла с тем же inode числом и сохраняет воспринятую жесткую ссылку.
  • С тех пор @option{-a} подразумевает @option{--no-dereference} это скопировало бы символьную ссылку, но позже @option{-H} говорит @command{cp} разыменовать параметры командной строки, где это затем видит два файла с тем же inode числом. Затем @option{--preserve=links} опция, также подразумеваемая @option{-a} сохранит воспринятую жесткую ссылку.
1
27.01.2020, 20:37

Было бы трудно преобразовать жесткие ссылки на символьные ссылки. В случае жесткой ссылки существует блок данных в файловой системе, которая имеет две или больше записи файла, указывающие на него. Нет никакого "источника" и "места назначения"; это - буквально один файл с несколькими эквивалентными именами. Можно использовать GNU, находят для идентификации их этот путь:

sauer@zipper:~$ find . -type f -links +1 -printf "%i: %p (%n)\n"
609: ./link1 (2)
609: ./link2 (2)

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

sauer@zipper:~$ find . -type f -links +1 -printf "%i %p\n" | sort -nk1
609 ./link1
609 ./link2

И затем имейте фигуру сценария, как выбрать одно из значений с тем же числом, чтобы иметь все, что другие связывают с ним. Возможно, первый становится целью, и больше с тем же inode symlinked к нему. Вот один действительно простой, непротестированный пример сценария оболочки

#!/bin/sh
prev=""
target=""
find /tmp -type f -links +1 -printf "%i %p\n" | sort -nk1 \
| while read inode file
do
  if [[ $inode != $prev ]]
  then
     target="$file"
     prev=$inode
  else
    ln -sf "$target" "$file"
  fi
done

Существуют потенциальные проблемы в этом, ссылки из различных каталогов могут быть созданы с недопустимой целью, если путь в находке (/tmp в этом примере) не является полным. Но общее представление должно быть прекрасным.

1
27.01.2020, 20:37
  • 1
    Хороший ответ, но это не отвечает на Вопрос, вместо этого это ответило бы, как к convert-a-hardlink-into-a-symbolic-link –  rubo77 06.12.2014, 11:07
  • 2
    , я создал сценарий, который берет рабочий каталог и исходный каталог как опции: gist.github.com/rubo77/7a9a83695a28412abbcd –  rubo77 06.12.2014, 13:59
  • 3
    Необходимо добавить -v для подробного к ln команда, и в первом просто пишет echo ln -sfv "$target" "$file" для наблюдения, что произошло бы иначе это будет действительно опасно. Если все выглядит хорошо, можно удалить echo –  rubo77 07.12.2014, 03:48
  • 4
    Вопрос говорит, что страница справочника объясняет, как пойти символьная ссылка-> hardlink и уже был ответ для этого; я ответил на остающийся вопрос о том, как возвратиться. Добавление a -v только говорит Вам, что аварийно завершилось, но да, положительная сторона у выполнения с эхом сначала. –  dannysauer 07.12.2014, 07:48

Теги

Похожие вопросы