В пределах одного каталога это может быть так же просто, как чтение всего списка файлов перед его обработкой (и 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 запустится во второй раз, поэтому вам потребуются меры безопасности. так или иначе.
После создания жесткой ссылки на файл остается только две ссылки на один файл. Хотя вы можете помнить, какая ссылка была первой, а какая второй, файловая система этого не делает.
Таким образом, редактор может определить, имеется ли более одной ссылки на файл или нет. Редактор может сохранить или не сохранить ссылку при сохранении нового файла.
Вам может понадобиться файловая система, поддерживающая cp --reflink
. Таким образом, вы получаете компактную копию, но когда вы изменяете копию, исходный файл не изменяется.