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.
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:
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 $my_file
, kan? Shell apa yang Anda gunakan?Jawaban:
Jangan repot-repot memeriksa apakah file itu ada, coba hapus saja.
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.sumber
rm /p/a/t/h 2> /dev/null
tidak 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.noclobber
di 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.Satu perintah baris lain yang saya gunakan adalah:
sumber
Anda bisa menggunakan ini:
sumber
echo $?
tidak memberikan 1 jika file tidak ada.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.
sumber
-f
itu tidak akan menimbulkan kesalahan. Jawaban ini membantu saya, terima kasih.Skrip shell satu liner untuk menghapus file jika sudah ada (berdasarkan jawaban Jindra Helcl):
[ -f file ] && rm file
atau dengan variabel:
sumber
Sesuatu seperti ini akan berhasil
-memeriksa apakah ini file biasa
-e memeriksa apakah file ada
EDIT: -e digunakan dengan -f berlebihan, untuk menggunakan -f saja harus bekerja juga
sumber
-a
sudah usang, gunakan-e
saja.-f
.-e
di-fe
berlebihan, seperti-f
juga cek keberadaan file sejauh yang saya tahu ..if [ $( ls <file> ) ]; then rm <file>; fi
Juga, jika Anda mengarahkan output Anda dengan
>
alih - alih>>
itu akan menimpa file sebelumnyasumber
file
mirip5 -lt 2