Можно ли переименовать файл или каталог, используя индекс?

10

Я изменил каталог / home на другой раздел и не смог получить к нему доступ к файлам, что я смог решить из этого вопроса: как получить доступ к содержимому предыдущего монтирования после переключения на другой раздел? ,

В случае, если я уже отмечал inode каталога, смогу ли я использовать его один для переименования каталога?

vfclists
источник

Ответы:

6

Вы можете переименовать файл (каталог или что-то еще), используя только знания о inode, используя find, но если (a) файловая система, содержащая его, не смонтирована, или если (b) есть другая файловая система, смонтированная поверх непустого каталога, который содержит файл, который вас интересует, файл просто не доступен вашей системе. В случае (a) вам необходимо смонтировать файловую систему, прежде чем вы сможете что-либо сделать с содержимым, включая переименование, а в случае (b) вам необходимо размонтировать файловую систему, которая смонтирована «поверх» каталога, содержащего файл, который вы хотите переименовать. Похоже, вы спрашиваете о случае (б).

Если я вас правильно понимаю, вы пытаетесь сделать ваш старый /homeкаталог (который находится в вашем корневом разделе) доступным, но при этом используете новый раздел, смонтированный в /home. Если это то, что вы хотите, сделайте следующее:

Закройте все файлы и выйдите из системы. Затем войдите в систему root(используйте для этого виртуальный терминал - нажмите Ctrl-Alt-F2). Выполните следующее:

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old

Если все хорошо, выйдите из системы и войдите в систему как вы сами, и все должно быть в порядке.

Кстати, команда для переименования файла, используя только знание его inode (при условии, что файл находится в текущем каталоге):

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;

Где 123456789номер инода, конечно. (Обратите внимание, что findопределяет имя файла и его путь и передает эту информацию mv; нет никакого способа переименовать файл без какого-либо участия существующего имени файла, но если это просто, что вы не знаете имя файла, это довольно просто.)

Wildcard
источник
Может ли команда mv переименовать напрямую в зависимости от inode? Я предполагаю, что команда find возвращает имя файла в его обычной текстовой форме.
vfclists
@vfclists: Нет, никакие mvиноды не будут приниматься.
Wildcard
6

В типичной файловой системе Unix вообще невозможно структурно переместить файл на основе inode. Причина в том, что переименование файла означает удаление его записи каталога из каталога, в котором он находится, и создание каталога в другом месте. Но индекс не содержит указатель на запись каталога, он содержит только (указатели) метаданные файла (метки времени, разрешения и т. Д.) И содержимое файла.

Для файла с несколькими жесткими ссылками, какую из них вы бы переименовали? В иноде недостаточно информации.

Для каталога в некоторых файловых системах было бы возможно действовать только с использованием одного inode:

  1. Прочитайте содержимое каталога, который определенно доступен из inode.
  2. Найдите запись каталога для ... Это указывает на родительский каталог.
  3. В родительском каталоге найдите запись каталога с правильным номером inode.

Это делает несколько предположений, однако:

  • Что если есть несколько записей для одного и того же inode? На самом деле, это не проблема: это вряд ли когда-либо случится на практике, так как большинство вариантов Unix запрещают явные жесткие ссылки на каталоги.
  • Существует ли ..в первую очередь? Это зависит от типа файловой системы. Некоторые файловые системы имеют явную запись для ..; для других эти записи подделываются драйвером файловой системы. Если ..не существует, этот подход в принципе невозможен.
  • Даже если файловая система содержит ..ссылки, есть еще один камень преткновения, который может быть неочевиден: шаг 1 может быть возможен внутри ядра, но для него нет интерфейса. Многие варианты Unix не имеют интерфейса, позволяющего открывать файл через его inode, потому что это будет обходить разрешения. Например, файл с разрешениями rwxr-xr-x(т. Е. rwx------Доступный для чтения), который находится в каталоге с разрешениями (т. Е. Доступен только его владельцу), недоступен никому, кроме владельца каталога. Это не может быть определено только из одного inode - файл может быть доступен через другую жесткую ссылку!

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

Единственный практический способ воздействовать на файл с учетом его inode - сначала найти путь, например, с помощью find -inum, а затем использовать путь для действия. Это не поможет в вашей ситуации, когда файл скрывается точкой монтирования. Нет портативного способа доступа к файлам, скрытым от точки монтирования; в Linux, как вы обнаружили, вы можете использовать bind mount.

Жиль "ТАК - перестань быть злым"
источник
-1

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

you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs

... дает мне файлы:

20191129_tucker.webm; и "Спасение Такер Карлсон сегодня вечером 11-29-19 ПОЛНОСТЬЮ - Breaking Fox News 29 ноября 2019.en.srt"

Я считаю, что это недостаток очень полезного в других отношениях.

Я могу изменить второе имя файла следующим образом:

$ ls -il "Спасение Такер Карлсон сегодня вечером 11-29-19 ПОЛНОСТЬЮ - Breaking Fox News 29 ноября 2019.en.srt"

... это дает мне список файлов с номером инода в самом начале:

13902671 -rw-r - r-- 1 Джеймс Джеймс 55793998 30 ноября 18:44 Сохранение Такер Карлсон Сегодня вечером 11-29-19 ПОЛНОСТЬЮ - Breaking Fox News 29 ноября 2019.en.srt

... тогда я бегу:

mvi 13902671 20191129_tucker.srt

Мой скрипт оболочки mvi bash:

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;
Джеймс
источник
Это не добавляет никакой новой информации помимо того, что было упомянуто ранее. Кроме того, ваш mviсценарий использует переменные без кавычек, что означает, что он потерпит неудачу, если какой-либо из аргументов, переданных сценарию, содержит пробельные символы (или, возможно, также, когда они содержат символы-заглушки).
Кусалананда