Как Linux обрабатывает команду перемещения

12

Как Linux обрабатывает команду перемещения под капотом?

Допустим, я перенесу мой дом реж

/home/me

и я переместить это в другой каталог

/home/foo/me

Как meменяются все пути к файлам и каталогам ? Я знаю, что моя Desktopдиректория под meтеперь /home/foo/me/Desktopи так, Documents /home/foo/me/Documentsно обновляет ли файловая система каждый путь, meчтобы отразить изменение? Это звучит не очень эффективно, и, вероятно, это не так.

Где я могу получить больше информации об этом?

Джефф
источник
5
Об эффективности: нет, это не будет эффективным. Когда вы перемещаете данные в другой каталог, данные фактически не читаются в одном месте, а записываются в другом. Файловая система содержит набор указателей на блоки данных. В случае перемещения обновляются только указатели.
Jos
Ах, это, вероятно, то, что имел в виду
Джефф
@Jos Откуда происходит фрагментация?
ноль298
3
@ zero298 Нет, фрагментация, как правило, совершенно иная и не связанная с ней проблема. Фрагментация не связана с содержимым структуры папок, а с содержимым одного файла, разбросанного по пластинам физического диска (вместо того, чтобы быть единой непрерывной строкой), сокращая чтение / записать производительность таких файлов. Содержимое больших / глубоких / ветвящихся деревьев папок обычно не должно быть непрерывным и перемещаться таким образом.
Петерис

Ответы:

21

Чтобы понять, как он перемещает папки, вам может понадобиться немного разбираться в файловой системе Linux. Все файлы и папки хранятся как часть структуры данных, называемой « inode ». Каждый файл имеет номер индекса, как и папки.

Чтобы просмотреть inode вашей папки, используйте команду ls -ial foldername. Первый столбец показывает номер индекса файла. Для каждой папки есть два уникальных имени .и .., представляющих собственный каталог и родительский каталог соответственно.

Вы можете попробовать провести эксперимент, чтобы переместить каталог (скажем, / home / me / source) с подкаталогами и файлами в другой каталог (например, / home / me / куда-то / еще). Номер инода / home / me / source и все его содержимое остаются неизменными до и после перемещения. Единственным отличием является номер инода .., который изначально имеет номер инода / home / me, а теперь становится номером инода / home / me / где-то / еще. В простой формулировке Linux обновляет ссылку на источник каталога, и тогда это делается.

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

Кеннет Л
источник
3
Правильно, пока движение не пересекает границы файловой системы.
Кодзиро
3

Если вы заинтересованы в том , как программе , такие , как mvи cpработа, помните , что они с открытым исходным кодом , и вы можете получить наиболее точное объяснение, прочитав код. Здесь есть ссылки на все основные утилиты. В частности, вы можете найти здесь

Хьюго Бафф
источник
6
you can get the most accurate explanation by reading through the code.Позволю себе не согласиться; Долгое время у меня не было абсолютно никакого опыта работы с Си, и даже сейчас я не предпочитаю его. Кроме того, исходный код часто оптимизируется и содержит больше граничных случаев, чем необходимо. Символическое объяснение часто помогает больше.
Шелваку
1
@shelvacu "содержит больше крайних случаев, чем необходимо". Надежный код обрабатывает все крайние случаи, которые могут присутствовать. Однако это правда, что представление всех крайних случаев в первом объяснении концепции может быть необязательным.
OregonTrail
@OregonTrail Извините, это то, что я имел в виду, в коде больше краевых случаев, чем необходимо для объяснения
Shelvacu
Я рад, что это было ваше первоначальное мнение, но вы все еще, казалось, упустили мой акцент на « ручках ». Хорошо написанный код не имеет крайних случаев, он обрабатывает крайние случаи. ;) Я знаю, что вы пришли из правильного места, но вы должны быть осторожны с вашими глаголами.
OregonTrail