Hapus file dalam direktori tanpa kesalahan jika sudah kosong

31

Sebagai bagian dari skrip penerapan, saya ingin membuang beberapa barang yang di-cache dari direktori temp saya. Saya menggunakan perintah seperti:

rm /tmp/our_cache/*

Namun, jika /tmp/our_cachekosong (cukup umum ketika mendorong banyak perubahan dalam suksesi cepat ke server pengujian kami), ini mencetak pesan kesalahan berikut:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

Ini bukan masalah besar, tapi agak jelek dan saya ingin mengurangi rasio noise-to-signal pada output dari skrip ini.

Apa cara ringkas di unix untuk menghapus isi direktori tanpa mendapatkan pesan yang mengeluh bahwa direktori tersebut sudah kosong?

Mark Amery
sumber

Jawaban:

48

Karena Anda mungkin ingin menghapus semua file tanpa diminta, mengapa tidak menggunakan -fsakelar rmuntuk mengabaikan file yang tidak ada?

rm -f /tmp/our_cache/*

Dari halaman manual:

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

Juga, jika mungkin ada subdirektori di dalamnya /tmp/our_cache/dan Anda menginginkannya serta isinya dihapus juga, jangan lupa -rsakelarnya.

depquid
sumber
3
solusi yang paling jelas dan saya tidak memikirkannya! Saya merasa seperti orang pertama dalam komik ini xkcd.com/399 ;-)
Huygens
6
find /tmp/our_cache/ -mindepth 1 -delete

Edit 1

dihapus "-type f

Edit 2

Menambahkan opsi non-standar -mindepth 1untuk mencegah direktori root pencarian dihapus (setelah menghilangkan -type fbatasan).

Hauke ​​Laging
sumber
Sekedar catatan, saya akan pergi -type fkarena mungkin ada direktori sementara juga (meskipun contoh dalam pertanyaan tidak memperhitungkan mereka, jadi mereka mungkin tidak ada di sana ...)
Izkata
1
menggunakan -type fhanya akan menghapus file biasa, jadi tautan simbolik misalnya tidak akan dihapus.
Huygens
@ terburu-buru Maaf, saya tidak memeriksa itu tetapi hanya melihat halaman manual yang mengatakan "Hapus file", tidak menyebutkan direktori. Saya menghapus komentar saya.
Hauke ​​Laging
1
Itu menghapus /tmp/our_cachesehingga Anda mungkin juga melakukannya rm -r /tmp/our_cache. Saat Anda menggunakan opsi yang tidak standar, Anda bisa menggunakannya -mindepth 1. Perhatikan bahwa bertentangan dengan rm /tmp/our_cache/*itu, ia juga menghapus subdirektori dan kontennya serta file tersembunyi.
Stéphane Chazelas
2

Anda dapat mengarahkan kesalahan standar /dev/nullsehingga tidak akan mencetak ini

$  rm /tmp/our_cache/* 2>/dev/null
pradeepchhetri
sumber
2
Bukankah ini juga akan menekan kesalahan yang ditampilkan jika, katakanlah, file tidak dapat dihapus karena sedang digunakan? Satu-satunya kesalahan yang ingin saya tekan adalah yang ditampilkan jika direktori target kosong; ini sepertinya akan memiliki efek samping yang tidak diinginkan.
Mark Amery
Bahkan jika Anda mencoba untuk menghapus beberapa file yang telah dibuka beberapa proses, Anda tidak akan mendapatkan kesalahan.
pradeepchhetri
1

Cara lain (meskipun sedikit berlebihan ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

ini menggunakan testatau [untuk menguji apakah string kembali dari menjalankan lsdi direktori Anda tidak kosong. Kemudian jika, dan hanya jika, string itu TIDAK kosong apakah itu menghapus semua yang ada di direktori Anda.

CATATAN: membiarkan glob keluar dari lsakan menekan kesalahan tidak ada file.

h3rrmiller
sumber
-1

Jika skrip Anda menggunakan BASH, Anda dapat mencoba:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Melakukannya masih akan menghasilkan kesalahan jika ada masalah "nyata" atau jika suatu file diproteksi (Anda kemudian membutuhkan -fpengubah rmuntuk menghapus jenis file ini) tetapi akan menghindari kesalahan ketika tidak ada file di sana.

Jika Anda menggunakan shell selain BASH untuk skrip Anda, seperti zsh, ksh, Anda dapat mencoba sintaks lain yang mungkin lebih portabel:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
Huygens
sumber