Sudahkah saya tidak melaporkan ketika file hilang?

39

Saya memiliki skrip bash yang ingin saya hapus file dari berbagai direktori. Seringkali, mereka tidak akan ada di sana karena mereka tidak dihasilkan dan itu baik-baik saja. Apakah ada cara untuk mendapatkan skrip untuk tidak melaporkan kesalahan itu, tetapi jika rm memiliki beberapa output lain untuk melaporkannya?

Atau, apakah ada perintah yang lebih baik untuk menghapus file yang tidak berisik?

flickerfly
sumber

Jawaban:

67

Gunakan -fopsi. Ini akan diam-diam mengabaikan file yang tidak ada.

Dari man rm:

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

[Bagian "tidak pernah meminta" berarti bahwa (a) -fmengabaikan opsi -iatau -Iopsi yang ditentukan sebelumnya , dan (b) file yang dilindungi akan dihapus tanpa diminta.]

Contoh

Tanpa -f, rmakan mengeluh tentang file yang hilang:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

Dengan -f, itu akan menjadi sunyi:

$ rm -f nonesuch
$
John1024
sumber
4
Oh, saya baru yang tidak meminta untuk dihapus, tidak menyadari itu juga mengabaikan ada. Saya benar-benar melewatkan itu ketika melihat pria. :-) Terima kasih. Saya akan menandai ini sebagai jawaban segera setelah saya diizinkan.
flickerfly
9

Jika kebutuhan Anda adalah bahwa rmtidak mengeluh tentang file yang hilang, tetapi Anda juga ingin setiap lain keluaran dari rm, saran saya akan ujian pertama bagi keberadaan target file, dan hanya memanggil rm( tanpa yang -fflag) jika file benar-benar ada.

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

Memanggil rm -ffile yang, misalnya, tidak memiliki izin pengguna-tulis, akan menghapus file dan juga tidak memancarkan prompt normal untuk skenario itu.

Jika Anda ingin menggunakan ide yang sama dengan banyak file, saya akan membuat definisi fungsi, seperti:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Gunakan seperti: qrm file1 file2-does-not-exist *.txt etc here

Jeff Schaller
sumber
1
Layak untuk menyadari kemungkinan sangat kecil dari kondisi balapan di mana file dihapus (atau dibuat) antara tes dan penghapusan, tetapi saya tidak bisa membayangkan bahwa menjadi relevan dalam situasi khusus di mana seseorang akan menggunakan skrip shell .
David Z
7

Anda menyatakan bahwa Anda masih ingin melihat output lain dari rmperintah ketika Anda menjalankannya, tetapi menggunakan -fopsi akan menekan itu. Anda perlu memfilter STDERR untuk apa yang Anda inginkan, yang sedikit rumit, mengingat Anda ingin semua yang lain ditampilkan.

Anda akan ingin menggunakan perintah seperti ini:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Perintah menjelaskan:

  • -f argumen adalah untuk memaksa dan tidak meminta konfirmasi atau kesalahan
  • 3>&1 1>&2 2>&3 3>&-adalah untuk beralih STDOUT dan STDERR untuk pemfilteran (Anda dapat membaca lebih lanjut tentang ini di sini jika diinginkan
  • | grep -v 'No such file or directory' sedang memfilter pesan yang tidak ingin Anda lihat

Sekarang, jika Anda hanya ingin sepenuhnya menekan pesan kesalahan, Anda bisa menjalankan perintah berikut:

rm filename 2> /dev/null

Perintah ini mengalihkan STDERR ke / dev / null sehingga Anda tidak akan melihatnya ketika Anda menjalankan perintah.

BriGuy
sumber
1
(AFAICS) rmtanpa-v pernah keluaran ke stdout, hanya stderr, jadi dalam hal ini Anda bisa saja 2>&1 | greptanpa tarian yang lebih bermanfaat secara umum,
dave_thompson_085
4

Sebagai alternatif, Anda dapat menggunakan findperintah dengan -deleteopsi. Ini (tentu saja) hanya akan menghapus file yang ditemukannya sehingga tidak pernah memperingatkan jika tidak ada. Contohnya mungkin:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

yang akan mencari /var/log/triffids/direktori dan menghapus semua file dengan .logakhiran yang belum dimodifikasi selama lebih dari 30 hari.

Itu selalu ide yang baik untuk menjalankan perintah ini tanpa satu -deleteopsi pertama, untuk memastikan itu menemukan file yang Anda harapkan.

seumasmac
sumber
Saya suka opsi ini dan akan mempertimbangkan perubahan. Terima kasih telah membagikannya.
flickerfly
3

Periksa opsi --force( -f) dari rm:

-f, --force

abaikan file dan argumen yang tidak ada, jangan pernah meminta

heemayl
sumber
2

Ini adalah retasan, tetapi Anda selalu touchdapat menghapus file tersebut. Jika tidak ada, itu akan dibuat sehingga rmdapat menghapusnya.

matega
sumber
Saya suka ini, kecuali untuk kinerjanya - berapa mahal untuk menyentuh beberapa K file daripada hanya menghapus yang tidak ada?
Dani_l
0

Anda dapat menggunakannya -fsesuai keinginan, menurut halaman manual:

Mencoba untuk menghapus file tanpa meminta konfirmasi, terlepas dari izin file tersebut. Jika file tidak ada, jangan tampilkan pesan diagnostik atau ubah status keluar untuk mencerminkan kesalahan. juga ingat opsi -f mengabaikan semua opsi -i sebelumnya.

rm -f xyz-directory

tidak akan meminta Anda apa pun, dan akan melakukan apa yang Anda inginkan.

Ankit Jain
sumber
-1

Ada dua cara utama: Jika Anda menambahkan opsi -f, itu tidak akan menunjukkan kesalahan "tidak ada" dan dua: (berfungsi untuk hampir semua perintah) alih-alih hanya melakukan "thecommand" do "thecommand 2> / dev / null "di mana" komunikasi "adalah perintah yang Anda lakukan.

John
sumber
1
Saya menghindari perpipaan karena saya tidak ingin kehilangan kesalahan lain yang mungkin muncul. Saya tidak tahu akan seperti apa mereka.
flickerfly