При перемещении текущего каталога я добираюсь “mv: не может переместиться '.' в '../dir/'.: Устройство или занятый ресурс”

Использовать screen. Это позволит Вам отсоединять свою целую сессию и присоединять ее снова от некоторого другого терминала.

Если Вы запускаете его без screen Ваш вывод связывается непосредственно с тем терминалом. В этом случае можно использовать инструмент как reptyr передать Ваш процесс другому терминалу. (Вероятно, в экранную сессию.;))

Альтернативы screen tmux и dtach.

Альтернатива reptyr retty.

Кроме того, neercs кажется, позволяет обоим.

5
21.03.2019, 13:45
4 ответа

Причина, по которой вы получаете сообщение:

MV: не может перемещаться . в ../ Общие /. ': Устройство или ресурс заняты

, связано с тем, как . , а .. работают в дополнение к MV . Когда вы перемещаете что-то в UNIX, команда MV пытается открыть все, что ссылается на inode элемент, который вы пытаетесь переместить. В этом случае это будет inode о том, что каталог состоит в том, что . ссылается на ссылку.

«Символы / ссылки» . .. .. связаны с инодовыми и находятся в смысле особенного. Вы можете прочитать о своей истории здесь, в под названием u & l Q & A под названием: Почему новый каталог имеет жесткую ссылку подсчет 2, прежде чем что-то добавляется к нему? , если вы когда-либо смотрели на недавно созданный каталог, Вы заметите, что он всегда начинается со связанного счета 2. Причина обусловлена ​​существованием . и .. .

$ mkdir adir

$ ls -l | grep adir
drwxrwxr-x. 2 saml saml 4096 Oct  5 08:02 adir

$ ls -la adir/
total 8
drwxrwxr-x. 2 saml saml 4096 Oct  5 08:02 .
drwxrwxr-x. 3 saml saml 4096 Oct  5 08:02 ..

Примечание: Ссылка для LS LS LS . Если вы неясно, здесь в этом U & L Q & A под названием: Что означает поля в LS -AL выхода?

так Не имена фактических каталогов, но являются «символами / ссылками», которые связаны с ними. Поэтому они менялись отсоединиться до того, чтобы быть в состоянии МВ .

Ну, поскольку ваша команда использует . , его нельзя не отключить команду MV , следовательно, MSG: «Устройство или ресурс заняты».

Ссылки

4
27.01.2020, 20:31

Вы не можете переместить каталог, в котором вы находитесь в данный момент. Текущий процесс - это тот, который держит его занятым.

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

7
27.01.2020, 20:31

Linux запрещает переименование любого пути, заканчивающегося в компоненте . или ... , возвращая ошибку EBUSY; также произойдет сбой:

$ mkdir a a/aa
$ mv a/aa/.. b
mv: cannot move ‘a/aa/..’ to ‘b/..’: Device or resource busy

Код для этого находится в namei.c::renameat. Последний компонент пути при передаче в различные функции должен иметь тип LAST_NORM, а не LAST_DOT или LAST_DOTDOT.

FreeBSD возвращает ошибку EINVAL в каждом из этих случаев.


Мы можем только догадываться, почему существует это ограничение.

Функция переименования() не будет работать, если:
. ...
[EBUSY] Каталог, названный старым или новым, в настоящее время используется системой или другим процессом, и реализация считает это ошибкой. Можно считать

. , который в настоящее время используется процессом. Но обратите внимание, что Linux позволяет следующее, поэтому каталога, просто используемого каким-либо процессом, недостаточно для того, чтобы переименование не прошло:

$ mkdir /tmp/t
$ cd /tmp/t
$ mv /tmp/t /tmp/t1
$ /bin/pwd
/tmp/t1

Причина, по которой запрещается переименование . и . , вероятно, "приводит к меньшей путанице пользователей".

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

Linux также запрещает rmdir путь, последним компонентом которого является ... (ENOTEMPTY) или . (EINVAL). FreeBSD возвращает ошибку EINVAL для каждого из них. Стандарт POSIX для rmdir имеет следующее:

Функция rmdir() не будет работать, если:
. ...
[EINVAL] Аргумент пути содержит последний компонент, который является точкой.

2
27.01.2020, 20:31

Невозможно сдвинуть точку . . Точка не совпадает с именем текущей директории. Можно подумать о . как указатель на каталог, но не на сам каталог, поэтому

$ pwd && echo $PWD && realpath .
/home/jimmij/tmp
/home/jimmij/tmp
/home/jimmij/tmp
$ mkdir tmp1 tmp2
$ mv tmp1/. tmp2/
mv: cannot move ‘tmp1/.’ to ‘tmp2/.’: Device or resource busy

не работает, но

cd tmp1
mv ../tmp1 ../tmp2

работает нормально, поэтому на самом деле вы можете переместить текущий каталог, хотя некоторые команды можно перепутать после этой операции:

$ pwd && echo $PWD && realpath .
/home/jimmij/tmp/tmp1
/home/jimmij/tmp/tmp1
/home/jimmij/tmp/tmp2/tmp1
$ cd .
$ pwd && echo $PWD && realpath .
/home/jimmij/tmp/tmp2/tmp1
/home/jimmij/tmp/tmp2/tmp1
/home/jimmij/tmp/tmp2/tmp1

Аналогичная история с . , т.е. с родительской директорией.

Другими словами, каждая директория должна содержать как минимум два элемента: . и ... . Их нельзя перемещать или удалять.

7
27.01.2020, 20:31

Теги

Похожие вопросы