Який сенс 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прапора? Чому воно існує?


6
Невдачі - це вигадливий бізнес. Візьмемо, наприклад, такий інструмент, як mount, наприклад, є кращі приклади. Ви дійсно хочете пам’ятати, якими є параметри за замовчуванням для кожного варіанту, щоб ви могли визначити, які параметри потрібно встановити? ДОБРО, ЩО мати варіанти як за замовчуванням, так і не за замовчуванням, тому ви можете чітко встановити параметр, а не подумки слідкувати, що таке за замовчуванням. Щось там легше запам’ятати, ніж щось там немає .
Wildcard

Еквівалентну поведінку не можна використовувати, якщо МВ перетворюється на mv-i
PlasmaHH

1
IMO, це також приємно використовувати в сценаріях, тому що ви явні. Це передає наміри трохи краще.
Blacklight Shining

Відповіді:


41

Використання -fбільш чітко описано на сторінці man із 4BSD, де було додано -fта -iпараметри:

Якщо файл2 вже існує, він видаляється перед переміщенням файлу1 . Якщо файл2 має режим, який забороняє писати, mv друкує режим і зчитує стандартний вхід для отримання рядка; якщо лінія починається з y, переміщення відбувається; якщо ні, mv виходить.

Параметри:

-iозначає інтерактивний режим. Кожного разу, коли потрібно перейти до існуючого файлу, користувачеві буде запропоновано ім'я файлу, а потім знак питання. Якщо він відповість рядком, який починається з «у», переміщення продовжується. Будь-яка інша відповідь запобігає здійсненню переїзду.

-fозначає силу. Ця опція перекриває будь-які обмеження режиму або -iкомутатор.

Ще більш точне визначення того, як працює mv, дано в стандарті POSIX , який додає, що -fвін переосмислює лише те, -iякщо воно відбудеться пізніше в командному рядку.

Тож поведінка за замовчуванням дещо відрізняється від -f. За замовчуванням потрібно просити підтвердження лише тоді, коли ціль не піддається запису. (Така поведінка повертається щонайменше до V4 , де mvне було прийнято жодних варіантів.) Якщо -iпараметр наданий, mv додатково просить підтвердити, коли ціль існує. Цей -fваріант забороняє запитувати в обох цих випадках (якщо це відбувається після будь-якого -i).


Чудова відповідь, дякую! Примітка. Деякі файлові системи (наприклад, CIFS) можуть викликати неприйнятну поведінку mv (тобто, що відрізняється від посібника), наприклад, діяти так, ніби -fпрапор був використаний, навіть якщо він не використовувався .
sampablokuper

Варто зазначити, що багато реалізацій просять підтвердження лише у тому випадку, якщо вони виявляються в інтерактивному терміналі ( 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) "божевільна", як ви
розумієте

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 Дякую, але з причин, які я зараз додав до питання, малоймовірно, що найважливіші псевдоніми, як alias mv="mv -i"це, є причиною існування -f. Ти також згадуєш сценарії та функції. Чи можете ви навести приклади, використовуючи ці два?
sampablokuper

@sampablokuper: оновлено.
choroba

@choroba, ще раз дякую На жаль, ні ваш приклад функції, ні ваш приклад сценарію не використовують mv -f, тому мені досі незрозуміло, як вони виправдовують / пояснюють його існування. Вибачте, якщо я пропускаю очевидне!
sampablokuper

@sampablokuper: Усі вони використовують mv -i. Якщо ви хочете використовувати їх, але пропустити взаємодію, ви б використовували MV -fтощо
choroba

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запобігає попередженню.


-1

У програмуванні оболонки використання -f - це загальна ідіома, яка використовується для того, щоб ваші команди не переривали помилки або просили сценарій / користувача про інтерактивну відповідь під час виконання певних команд. Останнє, що вам потрібно, - ваш сценарій призупинити очікування на введення користувача або, можливо, ще гірше, щоб неправильна команда взяла введення зі стандартного вводу.

Примітка: скасування псевдоніма може спричинити / усунути побічні ефекти. Якщо ви передали команду на іншу версію або з додатковими опціями, скасування псевдоніма призведе до небажаних побічних ефектів. Наприклад, у вас можуть бути встановлені псевдоніми з mv та rm для використання утилізації (або інших систем захисту / відстеження). Скасування псевдоніму порушить це ...


Nitpick: -fПараметр для cp або mv не гарантує, що "вони працюють". Наприклад, якщо дозвіл недостатній, команда -f не змусить його працювати. Що ти мав на увазі, це те, що -f змушує перезаписати без запиту. Протилежний прапор -i означає потребує інтерактивного перезапису.
Ерік Лещинський

Дві речі, які слід зазначити: 1.) Впровадження зазвичай перевіряє, чи ви навіть перебуваєте в інтерактивному терміналі ( isatty(0)), тому, наприклад, якщо ваш скрипт працює як частина труби, він не запускається. 2.) Додавання -fне те саме, що скасовувати, -iоскільки mv -i -fвідрізняється від mv, див . Відповідь Марка .
phk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.