Замените папку другой папкой, используя mv (без удаления целевой папки в первую очередь) - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь получить directory для замены существующего folder, но не могу сделать это с помощью mv - я верю, что есть способ, и я просто не знаю его (пока).Даже после просмотра справочной страницы и поиска в Интернете.

Если /path/to/ содержит только directory, следующая команда переместит /path/to/directory (исчезает) в /path/to/folder

mv /path/to/directory /path/to/folder

Это в основном переименование, чего я и пытаюсь добиться.

Но если /path/to/folder уже существует, эта же команда перемещает /path/to/directory в /path/to/folder/directory.

Я не хочу использовать команду cp, чтобы избежать ввода-вывода.

1 Ответ

0 голосов
/ 03 марта 2019

Вместо использования 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, выдаст вам ошибку, если вы попытаетесь создать ссылку на файл в другой файловой системе.)

...