skrip shell untuk menghapus file jika sudah ada

183

Saya mengerjakan beberapa hal di mana saya menyimpan data dalam file. Tetapi setiap kali saya menjalankan skrip akan ditambahkan ke file sebelumnya.

Saya ingin bantuan tentang cara menghapus file jika sudah ada.

Niks
sumber
3
Periksa apakah file itu ada ... lalu panggil rm $my_file, kan? Shell apa yang Anda gunakan?
Chris Sprague

Jawaban:

184

Jangan repot-repot memeriksa apakah file itu ada, coba hapus saja.

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

Perhatikan bahwa perintah kedua akan gagal (mengembalikan status keluar bukan nol) jika file tidak ada, tetapi yang pertama akan berhasil karena opsi -f(kependekan --force). Tergantung pada situasinya, ini mungkin detail penting.

Tetapi lebih mungkin, jika Anda menambahkan ke file itu karena skrip Anda menggunakan >>untuk mengarahkan sesuatu ke file. Ganti saja >>dengan >. Sulit dikatakan karena Anda tidak memberikan kode.

Perhatikan bahwa Anda dapat melakukan sesuatu seperti test -f /p/a/t/h && rm /p/a/t/h, tetapi melakukannya sama sekali tidak ada gunanya. Sangat mungkin bahwa tes akan mengembalikan true tetapi / p / a / t / h akan gagal ada sebelum Anda mencoba untuk menghapusnya, atau lebih buruk tes akan gagal dan / p / a / t / h akan dibuat sebelum Anda menjalankan perintah berikutnya yang mengharapkannya tidak ada. Mencoba ini adalah kondisi balapan klasik. Jangan lakukan itu.

William Pursell
sumber
5
Ini tidak membantu jika mereka perlu tahu apakah itu ada dan telah dihapus. Makan stderr tidak menyediakan itu. Tidak menangani keberadaan tidak memungkinkan Anda menjalankan skrip yang lebih luas tanpa gagal.
uchuugaka
@uchuugaka Ini adalah solusi sederhana ketika Anda tidak peduli jika ada file di sana, yang Anda inginkan adalah memastikan tidak ada di sana.
Lukas Liesis
Jawaban yang baik harus disampaikan dan lengkap tentang efek sampingnya adalah generalisasi pesan saya, tetapi skrip shell sering ingin tahu apa yang ditemukan atau tidak dan apa yang ditindaklanjuti atau tidak.
uchuugaka
rm /p/a/t/h 2> /dev/nulltidak akan menyimpan kode pengembalian ( echo $?) sebagai 0 jika file tidak ada. Itu akan membuat Jenkins jenis pekerjaan gagal hanya karena kami mencoba menghapus file yang tidak ada.
ViFI
@uchuugaka - Saya sudah lama tidak merespons komentar ini, tetapi perlu diatasi. Memeriksa apakah file ada sebelum Anda menghapusnya selalu merupakan ide yang buruk. Lihat paragraf terakhir dari jawaban saya. Ada kondisi ras yang melekat yang tidak bisa dihindari dengan melakukan hal semacam itu. Jika Anda tidak ingin menimpa file yang ada, Anda dapat mencoba beberapa keajaiban shell tertentu (seperti noclobberdi bash), atau mungkin chmod-ing file yang masih ada sehingga pengalihan gagal jika file ada (tidak menghindari kondisi balapan), tetapi semua yang akan dilakukan adalah membuat bug lebih halus.
William Pursell
127

Satu perintah baris lain yang saya gunakan adalah:

[ -e file ] && rm file
liwp_Stephen
sumber
11
Atau sebagai alternatif: [! -e file] || file rm. Versi ini mengembalikan 0 bukannya kesalahan.
nawfel bgh
@nawfelbgh Terima kasih, ini bagus untuk merantai skrip yang lebih panjang.
Abe
83

Anda bisa menggunakan ini:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi
Jindra Helcl
sumber
4
Ini harus menjadi jawaban yang dipilih.
ingernet
Sederhana dan mudah dibaca dan juga memastikan bahwa echo $?tidak memberikan 1 jika file tidak ada.
ViFI
Jika perlu, Anda juga dapat melakukan ini sebagai satu-liner, lihat jawaban saya di bawah ini.
nbeuchat
65

Jika Anda ingin mengabaikan langkah untuk memeriksa apakah file ada atau tidak, maka Anda dapat menggunakan perintah yang cukup mudah, yang akan menghapus file jika ada dan tidak membuang kesalahan jika tidak ada.

 rm -f xyz.csv
greperror
sumber
1
Ini hanya duplikat dari bagian dari jawaban berperingkat tertinggi, dari tahun 2015.
forgivenson
16
jawaban utama tidak menjelaskan bahwa dengan -fitu tidak akan menimbulkan kesalahan. Jawaban ini membantu saya, terima kasih.
Doug
Setuju dengan Doug meskipun ini sepertinya kasus penggunaan yang baik untuk mengedit tanggapan seperti wiki.
Philip
16

Skrip shell satu liner untuk menghapus file jika sudah ada (berdasarkan jawaban Jindra Helcl):

[ -f file ] && rm file

atau dengan variabel:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file
nbeuchat
sumber
13

Sesuatu seperti ini akan berhasil

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-memeriksa apakah ini file biasa

-e memeriksa apakah file ada

Pengantar jika untuk informasi lebih lanjut

EDIT: -e digunakan dengan -f berlebihan, untuk menggunakan -f saja harus bekerja juga

P1kachu
sumber
-asudah usang, gunakan -esaja.
mziccard
salahku, diperbaiki. Terima kasih @mziccard
P1kachu
ini akan menimbulkan kesalahan pada direktori atau tautan atau file tidak normal lainnya. Lebih baik / lebih aman untuk digunakan -f.
Jindra Helcl
1
baik. masih, yang -edi -feberlebihan, seperti -fjuga cek keberadaan file sejauh yang saya tahu ..
Jindra Helcl
Jika saya mengedit, saya hanya akan membuat duplikat dari jawaban Anda, tetapi saya akan menjelaskannya
P1kachu
4

if [ $( ls <file> ) ]; then rm <file>; fi

Juga, jika Anda mengarahkan output Anda dengan >alih - alih >>itu akan menimpa file sebelumnya

nLee
sumber
3
ini bukan satu-liner, maaf tapi yang @liwp_Stephen adalah itu.
fiorentinoing
Bahkan jika dikutip dengan benar, ini akan pecah jika filemirip5 -lt 2
William Pursell