Перемещение файлов и каталогов в подпапку в UNIX - PullRequest
0 голосов
/ 25 января 2011

Когда я печатаю

mv ../* . 
mv: cannot move '../<dir name>' to a subdirectory of itself, './<dir name>'

Как команда shell / mv обнаруживает это поведение?

Ответы [ 2 ]

1 голос
/ 25 января 2011

Оболочка отвечает за расширение подстановочных знаков, таких как *, перед передачей командной строки на mv и делает это напрямую, основываясь исключительно на том, какие файлы / каталоги существуют, не зная, что это за программа или что она может хочу сделать с этими именами. Таким образом, в этом случае ../* раскрывается для каждого имени файла / каталога в родительском каталоге, включая текущий каталог <имя каталога> . Затем mv просматривает список полученных аргументов, пытаясь переместить все, кроме последнего, в последний, что приводит к появившейся ошибке.

1 голос
/ 25 января 2011

Насколько я знаю, mv использует системный вызов POSIX rename(), для которого в спецификации сказано:

Функция rename () не будет работать, если:

(...)

[EINVAL] [CX] Новый путь к каталогу содержит префикс пути, который называет старый каталог.

... вместе смножество других подробных режимов сбоев.

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

...