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.


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.


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

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

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

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

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


-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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.