Какой смысл mv -f?

34

Руководство GNU Coreutils дляmv говорит:

-f --force Do not prompt the user before removing a destination file.

Тем не менее, это, кажется, уже поведение по умолчанию для mv, так что -fопция представляется излишней. Например, в GNU Bash версии 4.3.11:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

Кажется маловероятным, что целью -fфлага является переопределение alias mv="mv -i", потому что есть несколько стандартных способов переопределения псевдонима (например, использование \mv), которые бы делали это более кратко и согласованно для всех команд.

В руководстве отмечается, что «если вы укажете более одной из опций -i, -f, -n, вступит в силу только последний вариант», но все же кажется маловероятным, что цель -fфлага - переопределить -iфлаг в целом, потому что эквивалентное поведение может быть достигнуто простым использованием mv, что гораздо более кратко и понятно, чем использование mv -if.

В таком случае, какова цель -fфлага? Почему это существует?

sampablokuper
источник
6
По умолчанию это привередливый бизнес. Возьмите инструмент, такой как mount, например (хотя есть лучшие примеры). Вы действительно хотите запомнить, какие настройки по умолчанию для каждой опции, чтобы вы могли определить, какие опции вам нужно установить? ХОРОШО иметь опции как по умолчанию, так и не по умолчанию, так что вы можете явно установить опцию вместо того, чтобы мысленно отслеживать, что по умолчанию. Что-то там легче запомнить, чем что-то не там .
Подстановочный
Эквивалентное поведение не может использоваться, если MV преобразуется в mv-i
PlasmaHH
1
ИМО, это также хорошо для использования в сценариях, потому что вы явно. Это сообщает намерение немного лучше.
Blacklight Shining

Ответы:

41

Использование -fболее четко описанные в странице человека от 4BSD, который был где -fи -iбыли добавлены опции:

Если file2 уже существует, он удаляется до перемещения file1 . Если file2 имеет режим, который запрещает запись, mv печатает режим и читает стандартный ввод для получения строки; если линия начинается с y, движение происходит; если нет, то mv выходит.

Опции:

-iобозначает интерактивный режим. Всякий раз, когда ход должен заменить существующий файл, пользователю предлагается имя файла, за которым следует знак вопроса. Если он отвечает строкой, начинающейся с 'y', движение продолжается. Любой другой ответ предотвращает движение.

-fвыступает за силу. Эта опция отменяет любые ограничения режима или -iпереключателя.

Еще более точное определение того, как работает mv, дано в стандарте POSIX , который добавляет, что -fпереопределяет , только -iесли это происходит позже в командной строке.

Таким образом, поведение по умолчанию немного отличается от -f. По умолчанию запрашивается подтверждение только тогда, когда цель недоступна для записи. (Это поведение восходит, по крайней мере, до V4 , где mvне было никаких опций.) Если -iопция указана, mv дополнительно будет запрашивать подтверждение всякий раз, когда цель существует. -fВариант будет препятствовать задавать в обоих случаях , (если это происходит после любого -i).

Марк Плотник
источник
Отличный ответ, спасибо! NB. Некоторые файловые системы (например, CIFS) могут вызывать непредсказуемое поведение mv (т. Е. Отличное от руководства), например, поведение, как будто -fфлаг использовался, даже если он не использовался .
Сампаблокупер
Стоит отметить, что многие реализации запрашивают подтверждение, только если они находятся в интерактивном терминале ( isatty(0)). Кроме того, хотя это правда, что позднее -fпереопределяет -i, это не может означать, что это то же самое, что без аргументов.
phk
15

Это полезно, если установить выполнение mvв разумное значение по умолчанию:

alias mv="mv -i"

Когда вы захотите форсировать ход, это сработает:

mv -f

Так как это последняя опция в расширенной команде, которая имеет значение:

mv -i -f

Этот момент также упоминается в руководстве по GNU Coreutils .

Александр
источник
1
Спасибо, но по причинам, которые я сейчас добавил к вопросу, кажется маловероятным, что переопределение alias mv="mv -i"является причиной существования -f.
Сампаблокупер
12
Я возражаю против того, чтобы назвать поведение по умолчанию «делай, как тебя просят, никаких глупых вопросов» mv(1)(и другие команды Unix) как «безумное», как ты понимаешь ...
vonbrand
1
vonbrand, хотя я ценю прямой ответ команд Linux / UNIX без него -i, я считаю, что любой, кто использовал командную строку более нескольких лет, был сожжен mvв тот или иной момент.
Александр
1
Вы можете подумать, что переопределение -i маловероятно, но именно поэтому я думаю, что -f используется именно так.
Уолтер
11

Существует потому что ( man mv)

Если указать более одного -i, -f, -nтолько последний один вступает в силу.

Таким образом, вы можете иметь скрипт / псевдоним / функцию, который всегда запрашивает, но вы все равно можете переопределить эту опцию.

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

Разумеется, значимая функция / скрипт будет делать что-то большее (например, регистрировать действие).

choroba
источник
@choroba Спасибо, но по причинам, которые я сейчас добавил к вопросу, кажется маловероятным, что переопределение псевдонимов, например, alias mv="mv -i"является причиной существования -f. Вы упоминаете также скрипты и функции. Пожалуйста, не могли бы вы привести примеры с использованием этих двух?
Сампаблокупер
@sampablokuper: обновлено.
Чороба
@choroba, еще раз спасибо. К сожалению, ни ваш пример функции, ни ваш пример скрипта не используют mv -f, поэтому мне до сих пор неясно, как они оправдывают / объясняют его существование. Извините, если я упускаю очевидное!
Сампаблокупер
@sampablokuper: они все используют mv -i. Если вы хотите использовать их, но пропустите взаимодействие, вы бы использовали MV -fи т. Д.
Чороба
1
@sampablokuper Поведение mvбез какой-либо из этих опций заключается в том, чтобы иногда спрашивать (цель не доступна для записи и интерактивный терминал), так что это будет явной разницей между mv -fи \mv.
phk
5

mvКоманда по своей функции может по- разному с -fопцией, в том , что он будет пытаться перезаписи защищенных записей файлов без запроса.

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

Из-за разрешений на запись в каталог user2 может перезаписывать файлы user1 ./dir/, но перед этим будет предупрежден. -fпредотвращает предупреждение.

Centimane
источник
-1

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

Примечание: удаление псевдонима может вызвать / удалить побочные эффекты. Если вы добавили псевдоним команды в другую версию или с дополнительными опциями, отмена псевдонима вызовет нежелательные побочные эффекты. Например, вы можете настроить псевдоним с помощью mv и rm для использования корзины (или других систем защиты / отслеживания). Отмена псевдонима сломает это ...

Вальтер
источник
Nitpick: -fопция для cp или mv не гарантирует, что «они работают». Например, если разрешения недостаточно, команда -f не заставит его работать. Вы имели в виду, что -f вызывает перезапись без запроса. Противоположный флаг -i означает, что при перезаписи требуется интерактив.
Эрик Лещинский
Обратите внимание на две вещи: 1.) Реализации обычно проверяют, находитесь ли вы даже в интерактивном терминале ( isatty(0)), поэтому, например, если ваш скрипт выполняется как часть канала, он не будет запущен. 2.) Добавление -fэто не то же самое, что удаление, -iпотому что mv -i -fотличается от mv, см . Ответ Марка .
phk