periksa apakah direktori ada dan hapus dalam satu perintah unix

108

Apakah mungkin untuk memeriksa apakah ada direktori dan menghapusnya jika ada, di Unix menggunakan satu perintah? Saya memiliki situasi di mana saya menggunakan tugas 'sshexec' ANT di mana saya hanya dapat menjalankan satu perintah di mesin jarak jauh. Dan saya perlu memeriksa apakah direktori ada dan menghapusnya ...

remo
sumber
mengapa tidak menggunakan rmdir saja? jika direktori tidak ada, itu akan gagal.
Ferruccio
4
Itu akan gagal. Dan kesalahan dalam skrip ANT saya. Itu akan menyebabkan build saya rusak.
remo
Menggunakan mkdir -pakan mengabaikan kesalahan jika sudah ada.
pengguna562374
2
@ Ferruccio- menggunakan rm -rf / dir_name tidak menimbulkan kesalahan tetapi rm -rf / dir_name melempar mengatakan Tidak ada file atau direktori yang ditemukan. (Baru saja diuji)
remo
3
@remo bro, Anda baru saja memposting perintah yang sama dua kali
Marcos Pereira

Jawaban:

149

Dengan asumsi $WORKING_DIRdiatur ke direktori ... satu-baris ini harus melakukannya:

if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi

(jika tidak, ganti saja dengan direktori Anda)

Nick Grealy
sumber
164

Mengapa tidak digunakan saja rm -rf /some/dir? Itu akan menghapus direktori jika ada, jika tidak lakukan apa-apa. Tidak seperti rm -r /some/dirperintah ini, perintah tidak akan macet jika folder tidak ada.

Dominic Mitchell
sumber
13
Saya pikir pertanyaan awal dimaksudkan untuk: melakukan penghapusan hanya jika file / direktori ada atau tidak. Perintah ini dapat bekerja dan menghasilkan hasil yang serupa tetapi sebenarnya melakukan tes sebelum perintah lebih masuk akal.
Ankur Chauhan
5
@AnkurChauhan +1, saya mendapat peringatan jika dir tidak ada.
inf3rno
12
Ini bukanlah jawaban untuk pertanyaan itu.
xpto
10
Seperti yang dinyatakan di atas, ini bukanlah jawabannya. Salah satu alasan pengujian sebelum menghapus ada di dalam tugas Jenkins. Jika direktori tidak ada dan Anda mencoba untuk menghapusnya, pekerjaan itu akan gagal. Memeriksa terlebih dahulu adalah opsi yang lebih baik.
penebang kayu pada
8
Saya rasa ini adalah jawaban yang benar. ia melakukan apa yang dibutuhkan @remo, yaitu menghapus direktori hanya jika ada dan tidak memberikan kesalahan jika tidak ada. Mungkin pertanyaannya kurang tepat karena mengapa Anda perlu memeriksa keberadaan ketika perintah ini tidak peduli ?!
pedram bashiri
32

Mencoba:

bash -c '[ -d my_mystery_dirname ] && run_this_command'

EDIT : Ini akan berfungsi jika Anda dapat menjalankan bash di mesin jarak jauh ....

EDIT 2 : Dalam bash, [ -d something ]periksa apakah ada direktori yang disebut 'sesuatu', mengembalikan kode sukses jika ada dan merupakan direktori. Merangkai perintah dengan && menjalankan perintah kedua hanya jika perintah pertama berhasil. Jadi [ -d somedir ] && commandjalankan perintah hanya jika direktori tersebut ada.

sinelaw.dll
sumber
Ya, dan coba di shell untuk memastikan itu yang Anda inginkan.
sinelaw
Pertama saya ingin melihat apakah itu berfungsi secara lokal dan mereka saya dapat mengirim perintah dari jarak jauh. Apakah saya ingin mengatakan untuk memeriksa direktori "/ test "..hanya [-d ​​/ test] && mkdir / test?
remo
1
Ini harus memberikan kesalahan jika ada, karena memeriksa apakah direktori itu ada, dan jika ya mencoba membuatnya. Itulah yang dilakukannya untuk saya (baru saja diuji). Seharusnya tidak membuat direktori. Karena Anda ingin MENGHAPUS, Anda mungkin perlu: [ -d /test ] && rmdir /test(atau rm -rf / test jika tidak akan kosong dan Anda ingin menghapus semua isinya)
sinelaw
@SineLaw: CATATAN - Tidak ada kesalahan saat direktori ada untuk saya, dan mencoba membuat direktori! (mengujinya lagi). Tapi untuk DELETE Itu berhasil. Silakan periksa kembali itu
remo
sharma: apakah kamu menggunakan bash? apa yang dikatakan 'echo $ SHELL'?
sinelaw
0

Ini satu lagi liner:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && berarti mengeksekusi pernyataan yang mengikuti hanya jika pernyataan sebelumnya berhasil dijalankan (mengembalikan kode keluar nol)
Akhilesh Joshi
sumber