cp -p filename filename.tmp
mv -f filename.tmp filename
Создание его scriptable:
dir=$(dirname -- "$filename")
tmp=$(TMPDIR=$dir mktemp)
cp -p -- "$filename" "$tmp"
mv -f -- "$tmp" "$filename"
Выполнение копии сначала, затем перемещение ее в место, имеют преимущество, которое файл атомарно изменяет от того, чтобы быть жесткой ссылкой на то, чтобы быть отдельной копией (нет никакого смысла вовремя где filename
является неравнодушным или недостающим).
Вы, вероятно, подразумеваете, что хотите отколоть жесткую ссылку на отдельный, независимый файл.
mv hardlink tempname && cp tempname hardlink && rm tempname
hardlink является соединением между записью в каталоге и inode блоком на диске.
метаданные файла хранилища inodes, и для маленьких файлов, некоторые файловые системы хранят данные в inode, иначе указатели на блоки данных, и для очень больших файлов косвенные и двойные косвенные списки указателей на дисковые единицы выделения.
Независимо, соединение между именем файла (Который является тем, что производит команда ls) и inode блок, который хранит эти метаданные, называют жесткой ссылкой.
Наличие нескольких жестких ссылок на единственный файл означает тот же inode, на который ссылается больше чем одна запись каталога, возможно в различных каталогах (в единственной файловой системе)
комната удаляет запись имени файла из каталога. После того как на inode больше не ссылаются никакие файлы, его пространство освобождено для использования другими файлами.
cp
и mv
примеры подразумеваются. Так никакой путь вокруг использования временного файла, я вижу.
– 0xC0000022L
04.03.2013, 15:20
cp -a
(по крайней мере, GNU coreutils).
– vonbrand
04.03.2013, 15:29
cp
и mv
Я означал ясно давать понять, что я хочу, чтобы файл существовал позже.
– 0xC0000022L
04.03.2013, 15:21
Лучшим способом сделать это с помощью бэш-скрипта было бы что-то вроде этого:
if [ -f "$1" ] ; then
dir="$(dirname -- "$1")"
tmpfile="$(mktemp --tmpdir="$dir")"
cp --preserve=all -f -- "$1" "$tmpfile"
mv -f -- "$tmpfile" "$1"
fi
указывает на это:
mktemp
для создания файла, который гарантированно не существует-f
для принудительной перезаписи и --preserve=all
для сохранения метаданных как можно больше похожих на исходный файл -- --
и "
процитировать пути, содержащие пробелы и/или начинающиеся с -
Замена без создания временного файла невозможна с текущими (3.16) системными вызовами linux: в то время как можно перезаписать файл атоматически (т.е, удалить старый файл и заменить его на новый в качестве единственной операции), это невозможно сделать с файлом, который не имеет имени в файловой системе (т.е. временный файл, созданный с использованием флага O_TMPFILE
функции open
), поскольку функция rename
требует в качестве входного имени файла (отсутствует версия rename
, которая принимает в качестве входного дескриптора файла - подробнее см. here)
Если вы ищете все имена файлов, которые жестко привязаны к этому файлу, то вы можете использовать:
find -samefile myknowhardlinkfile
также ls -il myknowhardlink file
покажет вам количество имен файлов, жестко привязанных к одному и тому же inode (третье поле).
101612442 -rw-rw-r--. 2 me me 0 Aug 5 07:07 myknowhardlinkfile