Apa gunanya mv -f?

34

The GNU Coreutils panduan untukmv mengatakan:

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

Namun, ini tampaknya sudah menjadi perilaku default untuk mv, sehingga -fopsi tampaknya berlebihan. Misalnya dalam GNU Bash versi 4.3.11:

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

Tampaknya tidak mungkin maksud -fbendera adalah untuk menimpa alias mv="mv -i", karena ada beberapa cara standar untuk mengesampingkan alias (misalnya menggunakan \mv) yang akan melakukan ini lebih ringkas dan dengan cara yang konsisten di seluruh perintah.

Manual mencatat bahwa, "Jika Anda menentukan lebih dari satu opsi -i, -f, -n, hanya yang terakhir yang berlaku," tetapi tampaknya tidak mungkin maksud dari -fbendera tersebut untuk mengganti -ibendera secara umum, karena perilaku yang setara dapat dicapai hanya dengan menggunakan mv, yang jauh lebih ringkas dan mudah dipahami daripada menggunakan mv -if.

Karena itu, apa tujuan dari -fbendera? Mengapa itu ada?

sampablokuper
sumber
6
Default adalah bisnis yang rewel. Ambil alat seperti mount, misalnya (meskipun ada contoh yang lebih baik). Apakah Anda benar-benar harus mengingat apa default untuk setiap opsi, sehingga Anda dapat menentukan opsi mana yang perlu Anda atur? HAL YANG BAIK untuk memiliki opsi, baik untuk default maupun non-default, sehingga Anda dapat secara eksplisit mengatur opsi alih-alih perlu secara mental melacak apa defaultnya. Sesuatu di sana lebih mudah diingat daripada sesuatu yang tidak ada .
Wildcard
Perilaku Setara tidak dapat digunakan jika MV dikaitkan dengan mv-i
PlasmaHH
1
IMO, itu juga bagus untuk digunakan dalam skrip, karena Anda sedang eksplisit. Ini mengomunikasikan niat sedikit lebih baik.
Blacklight Shining

Jawaban:

41

Penggunaan -flebih jelas dijelaskan di halaman manual dari 4BSD, di mana -fdan -iopsi ditambahkan:

Jika file2 sudah ada, itu dihapus sebelum file1 dipindahkan. Jika file2 memiliki mode yang melarang penulisan, mv mencetak mode dan membaca input standar untuk mendapatkan baris; jika garis dimulai dengan y, perpindahan terjadi; jika tidak, mv keluar.

Pilihan:

-isingkatan dari mode interaktif. Setiap kali perpindahan dilakukan untuk menggantikan file yang ada, pengguna akan diminta dengan nama file diikuti dengan tanda tanya. Jika dia menjawab dengan garis yang dimulai dengan 'y', langkah itu berlanjut. Balasan lain mencegah langkah itu terjadi.

-fsingkatan kekuatan. Opsi ini mengabaikan semua pembatasan mode atau -isakelar.

Definisi yang lebih tepat tentang bagaimana mv beroperasi diberikan dalam standar POSIX , yang menambahkan bahwa -fhanya menimpa -ijika terjadi kemudian di baris perintah.

Jadi perilaku default agak berbeda dari -f. Standarnya adalah meminta konfirmasi hanya ketika target tidak dapat ditulisi. (Perilaku ini kembali setidaknya sejauh V4 , di mana mvtidak mengambil opsi.) Jika -iopsi diberikan, mv juga akan meminta konfirmasi setiap kali target ada. The -fpilihan akan menghambat bertanya dalam kedua kasus tersebut (jika terjadi setelah salah -i).

Tandai Plotnick
sumber
Jawaban yang bagus, terima kasih! NB Beberapa sistem file (misalnya CIFS) dapat menyebabkan mv menunjukkan perilaku yang tidak diharapkan (yaitu berbeda dengan manual), seperti bertindak seolah-olah -fflag telah digunakan bahkan jika belum digunakan .
sampablokuper
Perlu dicatat bahwa banyak implementasi hanya meminta konfirmasi jika tampaknya berada di terminal interaktif ( isatty(0)). Juga, meskipun benar bahwa kemudian -fditimpa -i, itu mungkin tidak berarti bahwa ini sama dengan tidak ada argumen yang diberikan.
phk
15

Ini berguna ketika mengatur eksekusi mvke standar waras:

alias mv="mv -i"

Saat Anda ingin memaksakan suatu gerakan, ini akan berhasil:

mv -f

Karena ini adalah opsi terakhir dalam perintah diperluas yang diperhitungkan:

mv -i -f

Poin ini juga disebutkan dalam manual GNU Coreutils .

Alexander
sumber
1
Terima kasih, tetapi untuk alasan yang sekarang telah saya tambahkan ke pertanyaan, sepertinya tidak mungkin mengesampingkan alias mv="mv -i"adalah alasan keberadaan -f.
sampablokuper
12
Saya keberatan untuk memanggil default "lakukan apa yang diminta, tidak ada pertanyaan bodoh" perilaku mv(1)(dan perintah Unix lainnya) "gila" seperti yang Anda
maksudkan
1
vonbrand, sementara saya menghargai respon langsung dari perintah Linux / UNIX tanpa -i, saya percaya bahwa siapa pun yang telah menggunakan baris perintah selama lebih dari beberapa tahun telah dibakar oleh mv, pada satu titik atau yang lain.
Alexander
1
Anda mungkin berpikir mengesampingkan -i tidak mungkin, tapi itulah mengapa saya akan menebak bahwa -f digunakan seperti itu.
Walter
11

Itu ada karena ( man mv)

Jika Anda menentukan lebih dari satu dari -i, -f, -n, hanya yang terakhir berlaku.

Jadi, Anda dapat memiliki skrip / alias / fungsi yang selalu meminta, tetapi Anda masih bisa mengganti opsi.

# alias
alias mv='mv -i'

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

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

Fungsi / skrip yang berarti akan melakukan sesuatu yang lebih, tentu saja (mis. Mencatat tindakan)

choroba
sumber
@choroba Terima kasih, tetapi untuk alasan yang sekarang saya tambahkan ke pertanyaan, sepertinya tidak mungkin alias utama seperti alias mv="mv -i"alasan keberadaan -f. Anda menyebutkan skrip dan fungsi juga. Tolong bisakah Anda memberikan contoh menggunakan dua ini?
sampablokuper
@sampablokuper: diperbarui.
choroba
@ choroba, terima kasih lagi. Sedihnya, baik contoh fungsi Anda maupun contoh skrip Anda tidak digunakan mv -f, jadi masih belum jelas bagi saya bagaimana mereka membenarkan / menjelaskan keberadaannya. Maaf jika saya melewatkan yang jelas!
sampablokuper
@sampablokuper: Semuanya digunakan mv -i. Jika Anda ingin menggunakannya tetapi lewati interaksi, Anda akan menggunakan MV -fdll.
choroba
1
@sampablokuper Perilaku mvtanpa opsi-opsi itu adalah kadang - kadang bertanya (target tidak dapat ditulisi dan terminal interaktif), jadi ini akan menjadi perbedaan yang jelas antara mv -fdan \mv.
phk
5

The mvperintah pada fungsi dapat sendiri berbeda dengan -fpilihan, dalam hal itu akan mencoba untuk menimpa dilindungi menulis file tanpa prompt.

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

Karena izin menulis di direktori, user2 dapat menimpa file user1 ./dir/, tetapi akan diperingatkan sebelum melakukannya. -fmencegah peringatan.

Centimane
sumber
-1

Dalam pemrograman shell, menggunakan -f adalah idiom umum yang digunakan untuk memastikan bahwa perintah Anda tidak dibatalkan dengan kesalahan atau meminta script / pengguna untuk respon interaktif ketika menjalankan perintah tertentu. Hal terakhir yang Anda inginkan adalah skrip Anda berhenti menunggu input pengguna, atau mungkin lebih buruk, untuk perintah yang salah untuk mengambil input dari standar.

Catatan: membatalkan alias dapat menyebabkan / menghilangkan efek samping. Jika Anda telah mengubah perintah ke versi lain atau dengan opsi tambahan, membatalkan alias akan menyebabkan efek samping yang tidak diinginkan. Misalnya, Anda mungkin memiliki pengaturan alias dengan mv dan rm untuk menggunakan recycle can (atau sistem perlindungan / pelacakan lainnya). Membatalkan alias akan merusak ini ...

Walter
sumber
Nitpick: -fOpsi untuk cp atau mv tidak menjamin bahwa "mereka berfungsi". Sebagai contoh jika izin tidak mencukupi, perintah -f tidak akan membuatnya berfungsi. Yang Anda maksud adalah bahwa -f memaksa overwrite tanpa prompt. Bendera yang berlawanan -i berarti membutuhkan interaktif untuk menimpa.
Eric Leschinski
Dua hal yang perlu diperhatikan: 1.) Implementasi biasanya akan menguji apakah Anda bahkan berada di terminal interaktif ( isatty(0)), jadi misalnya jika skrip Anda berjalan sebagai bagian dari pipa itu tidak akan terpicu. 2.) Menambahkan -ftidak sama dengan membatalkan -ikarena mv -i -fberbeda dari mv, lihat jawaban Markus .
phk