Bagaimana mencegah rm melaporkan bahwa file tidak ditemukan?

155

Saya menggunakan rmdalam skrip BASH untuk menghapus banyak file. Terkadang file tidak ada, sehingga melaporkan banyak kesalahan. Saya tidak butuh pesan ini. Saya telah mencari halaman manual untuk membuat perintah rm, tetapi satu-satunya pilihan yang saya temukan adalah -f, yang dari deskripsi, "abaikan file yang tidak ada, tidak pernah diminta", tampaknya menjadi pilihan yang tepat, tetapi nama itu sepertinya tidak cocok. , jadi saya khawatir ini mungkin memiliki konsekuensi yang tidak diinginkan.

  • Apakah -fopsi itu cara yang benar untuk diam rm? Kenapa tidak disebut -q?
  • Apakah opsi ini melakukan hal lain?
Desa
sumber
4
Anda tidak ingin menggunakan -f, ini menghapus file yang Anda tandai hanya baca.
pizza

Jawaban:

209

Penggunaan utama -fadalah untuk memaksa penghapusan file yang tidak akan dihapus menggunakan rmdengan sendirinya (sebagai kasus khusus, itu "menghapus" file yang tidak ada, sehingga menekan pesan kesalahan).

Anda juga dapat mengarahkan ulang pesan kesalahan menggunakan

$ rm file.txt 2> /dev/null

(atau setara dengan sistem operasi Anda). Anda dapat memeriksa nilai $? segera setelah menelepon rmuntuk melihat apakah suatu file benar-benar dihapus atau tidak.

chepner
sumber
3
--fberlaku untuk GNU Coreutils rm, tetapi hanya karena kebetulan merupakan singkatan unik untuk --force. Bentuk pendek -flebih jelas dan lebih portabel.
Keith Thompson
Tidak yakin saya menyadarinya. --fdi sini hanya salah ketik untuk -f.
chepner
2
apa yang 2 di 2>lakukan?
Dan
@Maverick Ini mengalihkan semua pesan yang dikirim ke stderr ke / dev / null alih-alih mengirimnya ke terminal.
Benjamin Nolan
73

Ya, -fadalah pilihan yang paling cocok untuk ini.

Satya
sumber
Beberapa sistem akan meminta Anda ketika ruangan bahkan dengan -f sampai Anda menggunakan backslash.
vimdude
11
@ vimdude: Ini bukan "beberapa sistem"; bahwa perilaku menunjukkan bahwa Anda memiliki fungsi shell atau alias yang memetakan rmke rm -i.
Keith Thompson
28

-f adalah flag yang benar, tetapi untuk operator uji, bukan rm

[ -f "$THEFILE" ] && rm "$THEFILE"

ini memastikan bahwa file itu ada dan merupakan file biasa (bukan direktori, simpul perangkat dll ...)

technosaurus
sumber
4
Namun, ini memiliki kondisi balapan, dan tidak boleh digunakan dalam skrip produksi.
tripleee
Saya percaya apa yang ditunjukkan @tripleee adalah bahwa tes "-f" dan penghapusan file dapat diselesaikan dalam urutan apa pun. Cara lain untuk melakukannya adalah if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi:, yang membuat tes dan langkah-langkah penghapusan file secara berurutan.
Robla
2
@robla kode itu melakukan hal yang persis sama dengan sintaksis lebih banyak verbose ... &&! = & ... Tes akan selalu terjadi sebelum rm tetapi proses terpisah secara teknis (meskipun sangat tidak mungkin) menghapusnya sebelum rm berjalan (sementara shell kode setelah tes ditafsirkan).
technosaurus
technosaurus - ooops, kau benar. Menurut Anda apa jawaban terbaik untuk pertanyaan @ mmlac?
robla
3
Dan hanya untuk mengonfirmasi, kondisi balapan adalah sesuatu dapat menghapus file antara testdan rm. Tidak ada cara yang rmbisa dilakukan sebelum di testsini. Melihat sebelum Anda melompat adalah kesalahan umum dalam pemrograman bersamaan - Anda tidak dapat mempercayai hasil dari "tampilan" lebih lama ketika Anda benar-benar "melompat"; solusi untuk itu adalah dengan menggunakan penguncian atau operasi atom. Itulah tepatnya yang Anda inginkan rm -f, yang merupakan contoh dari yang terakhir.
tripleee
13

\rm -f file tidak akan pernah melaporkan tidak ditemukan.

vimdude
sumber
4
-R tidak perlu dan berbahaya.
mahemoff
1
Saya mengasumsikan banyak file atau direktori. Baca kembali permintaan pengguna dan Anda benar dia hanya meminta file. Jadi dikoreksi jawaban saya
vimdude
Apa backslash sebelum perusahaan melakukan ?? tolong kawan, aku butuh jawaban untuk itu. Pada windows cygwin membuat versi 4.1 tidak dapat menangani \ rm sementara 3,75 berfungsi dengan baik.
Ayman Salah
2
@AymanSalah Backslash dalam konteks ini akan luput dari fungsi atau alias membungkus yang asli rm(seperti yang populer di beberapa situs pada awal 1990-an untuk mencegah pemula menghapus barang-barang dan kemudian memanggil sysadmin untuk mendapatkan file mereka kembali).
tripleee
Terima kasih - ini menyelesaikan masalah saya .. rupanya kode keluar memungkinkan untuk chaining menggunakan &&sementara tanpa -f rusak setelah file tidak ditemukan.
Igor
5

Sejauh rm -fmelakukan "apa pun", itu memang memaksa ( -fadalah singkatan untuk --force) penghapusan diam-diam dalam situasi di mana rmsebaliknya akan meminta Anda untuk konfirmasi. Misalnya, ketika mencoba untuk menghapus file yang tidak dapat Anda tulis dari direktori yang dapat Anda tulis.

Idelic
sumber
-9

Saya memiliki masalah yang sama untuk cshell. Satu-satunya solusi yang saya miliki adalah membuat file dummy yang cocok dengan pola sebelum "rm" di skrip saya.

Niranjan
sumber
7
Apakah itu satu - satunya solusi? Apakah Anda sudah mencoba rm -fatau tidak rm filename >&/dev/null?
Keith Thompson