Я держу свои точечные файлы под контролем версий, а сценарий их развертывания создает жесткие ссылки. Я также использую, etckeeper
чтобы поставить /etc
под контроль версий. Недавно я получил такие предупреждения:
warning: hard-linked files could cause problems with bzr
Простое копирование ( cp filename.ext filename.ext
) не будет работать:
cp: `filename.ext' and `filename.ext' are the same file
Переименование / перемещение файла - за исключением разных томов - также не нарушает жесткую ссылку.
Итак, мой вопрос: есть ли способ разорвать жесткую ссылку на файл, фактически не имея необходимости знать, где находятся другие жесткие ссылки на этот файл?
Ответы:
Делаем это скриптовым:
Делая копию сначала, а затем перемещая ее на место, преимущество в том, что файл атомарно превращается из твердой ссылки в отдельную копию (нет момента времени, когда он
filename
является частичным или отсутствующим).источник
Вы, вероятно, имеете в виду, что хотите разделить жесткую ссылку на отдельный независимый файл.
Жесткая ссылка - это связь между записью в каталоге и блоком inode на диске.
В inodes хранятся метаданные файла, а для небольших файлов некоторые файловые системы хранят данные в inode, в противном случае указатели на блоки данных, а для очень больших файлов - косвенные и двойные косвенные списки указателей на единицы размещения на диске.
Независимо от этого, соединение между именем файла (которое создает команда ls) и блоком inode, в котором хранятся эти метаданные, называется жесткой ссылкой.
Наличие нескольких жестких ссылок на один файл означает один и тот же индекс, на который ссылается более одной записи каталога, возможно, в разных каталогах (в одной файловой системе)
rm удаляет запись имени файла из каталога. Когда на индекс больше не ссылаются никакие файлы, его пространство освобождается для использования другими файлами.
источник
cp
иmv
примеры. Так что я не вижу возможности использовать временный файл.cp -a
(по крайней мере, GNU coreutils).Поместите это в конец вашего файла ~ / .bashrc.
Запустите это так
источник
Лучший способ сделать это с помощью bash-скрипта - это что-то вроде этого:
указывает на примечание:
mktemp
для создания файла, который гарантированно не существует-f
для принудительной перезаписи и--preserve=all
сохранения метаданных, максимально похожих на исходный файл--
и"
указывать пути, содержащие пробелы и / или начинающиеся с-
Выполнение замены без создания временного файла невозможно с текущими (3.16) системными вызовами linux: хотя можно перезаписать файл атомарно (т. Е. Удалить старый файл и заменить новым как одну операцию), он это невозможно сделать с файлом, который не имеет имени в файловой системе (т. е. временный файл, созданный с использованием
O_TMPFILE
флагаopen
функции), поскольку дляrename
функции требуется имя файла в качестве входных данных (нет версии,rename
которая принимает в качестве входных данных дескриптор файла - подробности смотрите здесь )источник
dirname
иmktemp
звонки. Исправлено это для вас ...$( ... )
подстановки команды -style. Одна из причин, это лучше, чем` ... `
стиль.`
вы вставили:`\``
(конечно, я дважды избежал этого, чтобы показать вам, что вы печатаете).Команда, которую вы ищете
unlink
источник
cp
иmv
я хотел прояснить, что я хочу, чтобы файл существовал позже.Если вы ищете все имена файлов, которые имеют жесткую ссылку на этот файл, то вы можете использовать:
также
ls -il myknowhardlinkfile
покажет вам номер файла, жестко связанный с тем же индексом (третье поле).источник