Apa gunanya opsi -f pada rm?

14

Dengan membaca halaman manual GNU coreutils rm, salah satu opsi adalah -f, yang menurut manual,

-f, --force
          ignore nonexistent files and arguments, never prompt

Sekarang, saya membuat beberapa tes dan menunjukkan itu memang jika saya menggunakan sesuatu seperti

rm -f /nonexisting/directory/

itu tidak akan mengeluh.

Apa yang benar-benar dapat diperoleh seseorang dari opsi semacam itu?

Ditambah contoh paling umum dari "menghapus direktori" menggunakan rmadalah sesuatu seperti

 rm -rf /delete/this/dir

The -rpilihan masuk akal, tapi -f?

saliarosaurus
sumber

Jawaban:

9

Saya menemukan bahwa halaman manual tidak memiliki sedikit detail dalam kasus ini. The -fpilihan rmsebenarnya memiliki cukup beberapa kasus penggunaan:

  • Untuk menghindari kesalahan kode keluar
  • Untuk menghindari diminta
  • Untuk melewati pemeriksaan izin

Anda benar bahwa tidak ada gunanya untuk menghapus file yang tidak ada, tetapi dalam skrip sangat nyaman untuk dapat mengatakan "Saya tidak ingin file-file ini, hapus mereka jika Anda menemukannya, tetapi jangan ganggu saya jika mereka tidak tidak ada ". Beberapa orang menggunakan set -edalam skrip mereka sehingga akan berhenti pada kesalahan apa pun (untuk menghindari kerusakan lebih lanjut yang dapat disebabkan skrip), dan rm -rf /home/my/garbagelebih mudah daripada if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Catatan tentang pemeriksaan izin: untuk menghapus file, Anda perlu izin menulis ke direktori induk , bukan file itu sendiri. Jadi misalkan ada file yang dimiliki oleh rootdi direktori home Anda dan Anda tidak memiliki sudoakses, Anda masih dapat menghapus file menggunakan -fopsi. Jika Anda menggunakan Git, Anda dapat melihat bahwa Git tidak meninggalkan izin menulis pada file objek yang dibuatnya:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Jadi, jika Anda menggunakan rm, satu-satunya cara untuk menghapus repositori Git tanpa menggunakan rootadalah menggunakan rm -rf.

phhehehe
sumber
4
-ftidak menghindari kode keluar kesalahan. Jika rmmencoba dan gagal menghapus file yang ada, itu akan mengembalikan kode kesalahan.
Gilles 'SANGAT berhenti menjadi jahat'
Saya telah menurunkan jawaban ini karena "Untuk menghindari kode keluar kesalahan" harus ditulis sebagai "Untuk menghindari kode keluar kesalahan jika tidak ada operan file atau operan file tidak ada". Karena jawaban ini ditulis sekarang, maka itu salah.
Harold Fischer
6

The -fpilihan menekan petunjuknya konfirmasi saat menghapus file read-only. Itu juga menekan kesalahan ketika satu atau lebih file yang disediakan tidak ada.

The -fpilihan berguna ketika Anda menyadari bahwa beberapa file yang Anda menghapus sedang dapat read-only, dan Anda tidak ingin diminta tentang hal itu.

The fpilihan juga berguna ketika Anda ingin menghapus beberapa file dalam kasus mereka ada, dan tidak ingin peduli apakah mereka ada atau tidak. Ini sangat umum digunakan dalam makefiles , untuk membuat perintah yang menghapus file yang dapat dibuat ulang dari file sumber. Misalnya, jika foo.odapat dibangun kembali dari foo.c, bar.odapat dibangun kembali dari bar.c, dan myappdapat dibangun kembali dari foo.odan bar.o, maka target makefile

clean:
        rm -f *.o myapp

menghapus myapp, foo.odan bar.ojika ada dan tidak mengeluh jika salah satu dari mereka tidak ada.

Termasuk -fdalam instruksi untuk menghapus pohon direktori tidak diperlukan dalam banyak kasus. Itu dapat dibenarkan karena jika Anda yakin ingin menghapus pohon direktori itu terlepas dari apa yang ada di dalamnya, maka Anda dapat menentukan -funtuk menghindari diminta jika seandainya beberapa file hanya baca-saja. Namun, orang-orang yang mengatakan untuk menjalankan rm -rfseringkali hanya mengulangi mantra mistis untuk menyingkirkan sesuatu, terlepas dari apakah pilihan -rdan -fsebenarnya diperlukan. Jika opsi tidak diperlukan, mereka tidak disarankan, karena mereka meningkatkan risiko kesalahan ketik dalam argumen akan menghancurkan sesuatu yang penting.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

The -iberalih kerm

Saya biasanya melihat -fsedang digunakan dengan rmketika rmperintah alias sehingga termasuk -isaklar untuk interaktif. The -fberalih menetralkan -i.

Contoh

Simulasikan masalah dengan rmmenjadi alias rm -i.

$ alias rm='rm -i'

Buat beberapa data palsu

$ touch afile

Sekarang cobalah untuk menghapusnya menggunakan versi alias rm

$ rm afile 
rm: remove regular empty file `afile'?

Sekarang coba gunakan -f

$ rm -f afile 
$

Izin

Saya juga percaya ada beberapa kasus di mana Anda memiliki akses hanya baca ke direktori dan ketika Anda mencoba untuk menghapus file dan atau sub-direktori di direktori tersebut, Anda akan ditantang dengan prompt yang sama yaitu "Anda yakin?". Penggunaan -fmenghilangkan harus mengatakan ya.

slm
sumber
Dengan menggunakan alias itu memang masuk akal. Dan jawaban Anda cocok dengan apa yang saya tunjukkan di halaman manual openbsd. Meskipun openbsd bukan GNU / Linux, tampaknya itu menggambarkan apa yang baru saja Anda katakan. Berikut adalah link jika seseorang ingin memeriksa: [link] openbsd.org/cgi-bin/...
saliarosaurus
Dengan bash Anda selalu dapat melakukannya \rmuntuk menjalankan tanpa aliasing (\ menjadi jalan pintas ke commandbuild itu). Saya menemukan penggunaan terbaik -fadalah dalam skrip shell di mana Anda memiliki sesuatu seperti file kunci yang mungkin ada atau tidak ada, -fmenghentikan rm: cannot remove 'file': No such file or directoryperingatan.
Drav Sloan
@ DravSloan Ya, itu juga masuk akal. Terima kasih atas jawaban Anda baik Drav Sloan dan slm
saliarosaurus
Saya rm -fsering menggunakan tepat cleansasaran di Makefiles
Alex
-itidak benar-benar tentang apa -f, itu lebih dari kasus tepi.
Gilles 'SANGAT berhenti menjadi jahat'