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 ...


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)


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.


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.


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)
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.