Как сделать так, чтобы при редактировании жестких ссылок, не являющихся оригиналами, они сначала копировались, а затем редактировались?

В пределах одного каталога это может быть так же просто, как чтение всего списка файлов перед его обработкой (и straceвыглядит так, как будто это происходит):

# keep reading entries first
openat(AT_FDCWD, ".", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_DIRECTORY) = 4
getdents(4, /* 1024 entries */, 32768)  = 32752
getdents(4, /* 1024 entries */, 32768)  = 32768
getdents(4, /* 426 entries */, 32768)   = 13632
getdents(4, /* 0 entries */, 32768)     = 0
close(4)                                = 0

(выходные данные сокращены для удобства чтения)

# process stuff later
clone(...
wait4(...
--- SIGCHLD...
clone(...
wait4(...
--- SIGCHLD...

В целом, однако, findвообще не предотвращает появление петель. Если вы перемещаете файлы в подкаталог, это происходит несколько раз:

mkdir -p sub/sub/sub/sub
find -type f -exec mv {} sub/{}_foo \;

Это приводит к sub/sub/sub/sub/file_foo_foo_foo_fooи подобным вещам.(-depthможет помочь в этом случае ).

Лучше вообще избегать любых возможных столкновений, чем слепо полагаться findна использование некоторой магии, которой просто нет. Ваш вопрос до вашего редактирования был хорошим решением, поскольку он просто вообще не соответствовал уже переименованному файлу.

Даже в тех случаях, когда это не является строго обязательным, было бы неплохо четко указать, что файлы не могут и не должны обрабатываться дважды. Здесь мы переименовываем файлы jpg, а не файлы foo.

Кроме того, даже если findв одном вызове предотвратит повторную обработку файлов, всегда есть риск, что скрипт в целом -запустится повторно, и find запустится во второй раз, поэтому вам потребуются меры безопасности. так или иначе.

0
06.03.2021, 23:50
1 ответ

После создания жесткой ссылки на файл остается только две ссылки на один файл. Хотя вы можете помнить, какая ссылка была первой, а какая второй, файловая система этого не делает.

Таким образом, редактор может определить, имеется ли более одной ссылки на файл или нет. Редактор может сохранить или не сохранить ссылку при сохранении нового файла.

Вам может понадобиться файловая система, поддерживающая cp --reflink. Таким образом, вы получаете компактную копию, но когда вы изменяете копию, исходный файл не изменяется.

1
18.03.2021, 22:26

Теги

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