переименование огромной папки: это рискованно?

19

Рискованно ли переименовывать папку с 180GB mvкомандой?

У нас есть папка, /dataкоторая содержит 180 ГБ.

Мы хотим переименовать /dataпапку /BD_FILESс помощью mvкоманды.

Безопасно ли это делать?

Яэль
источник
14
Почему и как это должно быть рискованно? Если вы не уверены, позвоните mvс -iопцией.
десерт
5
Есть ли что-то в вашей среде, что заставляет вас думать, что это может быть рискованно?
Джефф Шаллер
2
Вы имеете в виду, есть ли риск, что само по себе действие может вызвать проблемы, или есть риск, что могут быть проблемные последствия? Если у вас есть какие-либо программы, ожидающие наличия папки / data, то переименование может вызвать проблемы.
накопление
3
Примечание: почти все безопасно, если вы проверили резервные копии. Ничто не так безопасно, как должно быть, если вы этого не сделаете. Другими словами: когда вы спрашиваете «это безопасно», ваша первая мысль должна быть «проверил ли я свои резервные копии?»
RedGrittyBrick
2
Я имею в виду риск, который может быть проблематичным, когда перемещение огромной папки с данными этой ОС может остановить перемещение, например, в середине или потерять данные
yael

Ответы:

71

Изменение имени в папке является безопасным, если оно остается в той же файловой системе.


Если это точка монтирования ( /dataпохоже, это может быть точка монтирования для меня, проверьте это с помощью mount), тогда вам нужно сделать что-то, кроме простого, mvтак mv /data /BD_FILESкак данные будут перемещены в корневой раздел (что может быть ты хочешь случиться).

Вы должны размонтировать файловую систему, переименовать теперь пустой каталог, обновить /etc/fstabс новым местоположением для этой файловой системы, а затем перемонтировать файловую систему в переименованном месте.

Другими словами,

  1. umount /data
  2. mv /data /BD_FILES(при условии, что он /BD_FILESеще не существует, в таком случае сначала удалите его)
  3. обновление /etc/fstab, изменение точки монтирования от /dataдо/BD_FILES
  4. mount /BD_FILES

Это не включает копирование каких-либо файлов, оно просто меняет имя каталога, который действует как точка монтирования файловой системы.


Если переименование каталога связано с перемещением его в новую файловую систему (что будет иметь место, если он /dataнаходится на одном диске, а /BD_FILESна другом - обычное дело, например, если вы перемещаете файлы в больший раздел) Я бы порекомендовал копировать данные, не трогая оригинал до тех пор, пока вы не убедитесь, что копия в порядке. Вы можете сделать это с

rsync -a /data/ /BD_FILES/

например, но посмотрите rsyncруководство, чтобы узнать, что он делает и чего не делает (например, он не сохраняет жесткие ссылки).


После того, как папка переименована, вам также необходимо убедиться, что существующие процедуры (программы и пользователи, использующие папку, резервные копии и т. Д.) Знают об изменении имени.

Кусалананда
источник
9
Существует риск, что кто-то ожидает mvпросто выполнить renameсистемный вызов, но из-за обстоятельств он не осознал, что собирается скопировать файлы и удалить оригинал. Если мне нужно быть абсолютно уверенным, просто выполняется renameсистемный вызов, и я mvне собираюсь делать что-то «умное» за моей спиной, я открываю оболочку Python и использую os.rename.
Касперд
3
С относительно недавним ядром Linux вы можете вместо этого переместить точку монтирования:mkdir /BD_FILES && mount -M /data /BD_FILES && rmdir /data
David Foerster
2
@MichealJohnson Это, вероятно, будет работать в системе Linux, да. rsyncОтличная вещь в том, что он перезапускается.
Кусалананда
3
@MichealJohnson One использует инструменты, которые удобнее всего использовать, очевидно. Да, rsync -aсохраняет почти все метаданные, но не жесткие ссылки, ACL или расширенные атрибуты (добавьте -HAXдля этого).
Кусалананда
3
@Max В разных дистрибутивах разные renameкоманды с разным поведением. Я думаю, что это достаточная причина, чтобы не использовать renameкоманду, если вы хотите быть уверенными в том, что она собирается делать.
Касперд
16

Вы не переименовываете каждый файл в каталоге, вы переименовываете один файл в /. Это потому что:

  1. каталоги являются файлами, и
  2. файловая система действительно заботится об индексе, а не о самом тексте.

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

RonJohn
источник
14

Если вы просто переименуете (источник и цель в одной файловой системе), это просто переименование записи каталога. Это либо успешно, и каталог имеет новое имя, либо не удается, и в этом случае ничего не меняется * .

Если источник и цель находятся в разных файловых системах, данные должны быть скопированы mv. Различия в функциях файловой системы, такие как максимальный размер файла, ограничения в именах файлов и т. Д., Могут вызвать проблемы. Чтобы избежать проблем, первой копии файлов ( cp, rsync, ...) , и после успешного завершения копирования, удаления файлов в исходном местоположении.

* Однако есть некоторые угловые случаи, например, упомянутые в разделе BUGS в man 2 rename

sebasth
источник
> «Это либо успешно, и у каталога новое имя, либо в этом случае ничего не меняется». Как это гарантировано? Это правда для всех файловых систем? Есть ли документация по этому поводу?
turbanoff
Rename - это одиночный системный вызов, однако в разделе BUGS в man rename есть примечание о NFS : переименование может быть успешным, даже если при использовании NFS возвращается ошибка (подробности см. На странице man). Я добавил примечание в ответ тоже. Я не ожидаю, что какая-либо файловая система в ядре сочтет приемлемым исчезновение записи каталога в случае неудачного переименования.
Себастьян
8

Как уже говорили другие, переименование папки не представляет риска для содержимого. Но есть другой вид риска, который вы можете рассмотреть.

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

Одна вещь, которую вы можете сделать, это создать символическую ссылку для нового имени каталога, но оставить старое имя на некоторое время. Это даст вам время оценить влияние этого изменения. Вы можете временно удалить старое имя, посмотреть, есть ли какие-либо проблемы, и, если они есть, просто воссоздать старое имя, чтобы люди могли продолжать работать, пока вы выясняете, что нужно обновить.

Команда что-то вроде этого должна сделать это: ln -s /data /BD_FILES

барбекю
источник
4
Еще один легкий риск, о котором еще никто не упомянул, заключается в том, что в зависимости от стратегии резервного копирования для этой папки это может привести к проблемам с дисковым пространством и задержками на диске резервного копирования из-за внезапного появления 180 ГБ «новых» данных и необходимости их использования. быть резервным.
Кент,
Я предпочитаю что-то вроде mv thing1 thing2 ; ln --symbolic ./thing2 thing1. Таким образом, я получил новое имя и могу легко проверить отсутствие старого, удалив символическую ссылку.
can-ned_food
3

Переименование атомное. Единственный разумный риск заключается в том, mvчто по какой-то причине решается все скопировать, и это приводит к сбою на полпути. Если у вас есть GNU mv, mv -Tснимите этот риск.

mv -Tговорит, mvчто перемещается в не-папку; что заставит его отказаться от выполнения, mkdir()что, в свою очередь, приведет к сбою при перемещении папки, и он решил копировать по какой-то причине.

Я участвовал в устранении ошибок, mv -Tработая над магистерской диссертацией несколько лет назад. Раньше делали неправильные вещи в слишком многих крайних случаях.

С другой стороны, у вас есть 180 ГБ пользовательских данных в корневом разделе. Вы, вероятно, хотите переместить это из корневого раздела.

Джошуа
источник
По названию нельзя определить, находится ли что-то в «корневом разделе» или нет.
Питер
@Peter: Если это не корневой раздел, это точка монтирования. Вы не можете переименовать смонтированные точки монтирования с помощью команды mv.
Джошуа