Вместо использования cp
для фактического копирования данных в каждый файл, используйте ln
, чтобы сделать "копии" указателей в файл.
ln /path/to/directory/* /path/to/folder && rm -rf /path/to/directory
Обратите внимание, что это немного больше атома, чем при использовании cp
;каждый отдельный файл появляется в /path/to/folder
за один шаг (т. е. нет шансов, что /path/to/folder/foo.txt
будет частично скопирован), но есть небольшое окно, в котором были некоторые, но не все файлы из /path/to/directory
связанный с folder. Also, the
rm -rf is not atomic, but assuming no one is interested in
directory , that's not an issue. (Although, as files from
/ path / to / directory are unlinked, you *can* see changes to the link counts of files under
/ path / to / foldoer` меняется с 2 на 1. Маловероятно, что кто-то об этом позаботится.)
То, что вы считаете файлом, на самом деле представляет собой просто запись файловой системы в анонимном файле, управляемом файловой системой.Например, рассмотрим простой пример.
$ mkdir d
$ cd d
$ echo hello > file.txt
$ cp file.txt file_copy.txt
$ ln file.txt file_link.txt
$ ls -li
total 24
12890456377 -rw-r--r-- 2 chepner staff 6 Mar 3 12:46 file.txt
12890456378 -rw-r--r-- 1 chepner staff 6 Mar 3 12:47 file_copy.txt
12890456377 -rw-r--r-- 2 chepner staff 6 Mar 3 12:46 file_link.txt
Опция -i
добавляет каждый номер индекса inode (первый столбец) к выводу;индекс может рассматриваться как уникальный идентификатор файла.В этом выводе вы можете видеть, что file_copy.txt
- это совершенно новый файл с инодом, отличным от file.txt
.file_link.txt
имеет точно такой же индекс, то есть file.txt
и file_link.txt
- это просто два разных имени для одной и той же вещи.Число непосредственно перед владельцем - количество ссылок ;file.txt
и file_link.txt
оба ссылаются на файл с числом ссылок 2.
Когда вы используете rm
, вы просто удаляете ссылку на файл, а несам файл.Файл не удаляется, пока количество ссылок не уменьшится до 0. Для демонстрации мы удалим file.txt
и file_copy.txt
.
$ rm file.txt file_copy.txt
$ ls -li
total 8
12890456377 -rw-r--r-- 1 chepner staff 6 Mar 3 12:46 file_link.txt
Как видите, единственная ссылка на file_copy
больше нет, поэтому inode 12890456378 больше не отображается в выходных данных.(Независимо от того, действительно ли данные действительно удалены, это вопрос реализации файловой системы.) file_link.txt
, тем не менее, все еще ссылается на тот же файл, что и раньше, но теперь с количеством ссылок 1, потому чтоfile.txt
удалено.
Ссылки на файл не обязательно должны отображаться в одном каталоге;они могут появиться в любом каталоге в той же файловой системе , которая является единственным предупреждением, использующим этот прием.(ln
, IIRC, выдаст вам ошибку, если вы попытаетесь создать ссылку на файл в другой файловой системе.)