LINUX.ORG.RU

Почему мануал mv не отображает его поведение?

 


0

1

Что имеем в мануале:

NAME
       mv - move (rename) files

SYNOPSIS
       mv [OPTION]... [-T] SOURCE DEST
       mv [OPTION]... SOURCE... DIRECTORY
       mv [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.

Что имеем по факту:
Если не указывать опцию -T (про которую есть только скудное описание из которого ничего не понятно)


       -T, --no-target-directory
              treat DEST as a normal file

то mv меняет своё поведение исходя из наличия\отсутствия файлов.

  • Если DEST не существует, то mv переименует SOURCE в DEST
  • Если DEST существует, то mv переименует SOURCE в DEST/SOURCE

Ни одного слова про такое изменение поведения в мануале, конечно же, нет.

Где напоролся:
Запускал скрипт, который переименовывает директории согласно шаблону. Иногда попадаются директории, которые уже переименованы (DST=SRC, о чем я не знал), и вместо того, чтобы сказать мне, что, мол, там такой файл уже есть mv попытался поместить директорию в саму себя (SRC/SRC).

Это неочевидное поведение или в мане где-то между строк что-то всё же есть?

★★★★★

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

firkax ★★★★★
()

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

аналогия из жизни - ты скажешь «положить лампу А в коробку Б» а не «положить лампу А в коробку/лампу А/Б»

в «человеческом» индекс начинается с 1.
в «машинном» есть +0 и -0.
и т.д.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 2)
Ответ на: комментарий от Elyas

Условие изменения поведения не описано. Всё равно что написать «переименовывает файл или удаляет все файлы в домашней директории»

PPP328 ★★★★★
() автор топика

Кроме man другой документации нет что-ли?

Выдержка из выхлопа команды

info mv

   • If the ‘--target-directory’ (‘-t’) option is given, or failing that
     if the last file is a directory and the ‘--no-target-directory’
     (‘-T’) option is not given, ‘mv’ moves each SOURCE file to the
     specified directory, using the SOURCEs’ names.

Дальше там еще более подробная сноска(ибо опция -T есть НЕ ТОЛЬКО у mv):

‘-T’
‘--no-target-directory’
     Do not treat the last operand specially when it is a directory or a
     symbolic link to a directory.  This can help avoid race conditions
     in programs that operate in a shared area.  For example, when the
     command ‘mv /tmp/source /tmp/dest’ succeeds, there is no guarantee
     that ‘/tmp/source’ was renamed to ‘/tmp/dest’: it could have been
     renamed to ‘/tmp/dest/source’ instead, if some other process
     created ‘/tmp/dest’ as a directory.  However, if ‘mv -T /tmp/source
     /tmp/dest’ succeeds, there is no question that ‘/tmp/source’ was
     renamed to ‘/tmp/dest’.

     In the opposite situation, where you want the last operand to be
     treated as a directory and want a diagnostic otherwise, you can use
     the ‘--target-directory’ (‘-t’) option.

Pinkbyte ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.