Bagaimana cara menggunakan Bash untuk membuat folder jika belum ada?

179
#!/bin/bash
if [!-d /home/mlzboy/b2c2/shared/db]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

Ini sepertinya tidak berhasil. Adakah yang bisa membantu?

mlzboy
sumber
4
Mengapa Anda memiliki titik koma?
ADTC
1
The ;token pemisah perintah, sehingga adalah baris baru. Seperti thenperintah terpisah, titik koma sebelumnya diperlukan untuk dapat menulisnya di baris yang sama. Titik koma setelah mkdirdan fisuperflous.
Andreas Riedmüller

Jawaban:

278

Pertama, dalam bash "[" hanyalah sebuah perintah, yang mengharapkan string "]" sebagai argumen terakhir, jadi spasi putih sebelum tanda kurung tutup (serta antara "!" Dan "-d" yang perlu dua argumen terpisah juga) penting:

if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

Kedua, karena Anda menggunakan -p beralih ke mkdir, pemeriksaan ini tidak berguna, karena ini adalah apa yang dilakukan. Tulis saja:

mkdir -p /home/mlzboy/b2c2/shared/db;

dan itu saja.

Maxim Sloyko
sumber
2
Catatan: -pbendera menyebabkan direktori induk dibuat jika perlu.
Danijel
13
Ya Tuhan, saya tidak pernah tahu bahwa "[" adalah perintah. Ini menjelaskan banyak masalah saya ... Mudah hal paling berguna yang pernah saya baca di StackOverflow.
Ben Kushigian
1
Wow! Mengetahui bahwa "[" adalah perintah di bash adalah pembuka mata. Saya merasa seperti banyak masalah dengan skrip bash saya sekarang telah diselesaikan!
raluru
93

Sebenarnya tidak perlu memeriksa apakah itu ada atau tidak. Karena Anda sudah ingin membuatnya jika ada, mkdir akan melakukannya

mkdir -p /home/mlzboy/b2c2/shared/db
kurumi
sumber
2
Catatan: -pbendera menyebabkan direktori induk dibuat jika perlu.
Danijel
67

Cukup lakukan:

mkdir /path/to/your/potentially/existing/folder

mkdir akan melempar kesalahan jika folder sudah ada. Untuk mengabaikan kesalahan tulis:

mkdir -p /path/to/your/potentially/existing/folder

Tidak perlu melakukan pengecekan atau semacamnya.


Sebagai referensi:

-p, --parents no error if existing, make parent directories as needed http://man7.org/linux/man-pages/man1/mkdir.1.html

Otomatis
sumber
3
Argumen -ptersebut tidak mengabaikan kesalahan: ia memunculkan mode berbeda di mana komponen jalur yang tidak ada dibuat (dan karenanya itu bukan kesalahan jika terjadi bahwa nol perlu dibuat). Perilaku ini berbeda karena akan membuat komponen selain yang terakhir, yang mungkin atau tidak diinginkan.
BeeOnRope
23

Anda membutuhkan ruang di dalam [dan ]kurung:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi
dogbane
sumber
18

Cara bersih, manfaatkan evaluasi jalan pintas operator logis shell. Sisi kanan operator dieksekusi hanya jika sisi kiri benar.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db
plesiv
sumber
11
mmh, tidak bersih: hanya lebih pendek. Sulit untuk memahami arti dari pernyataan seperti itu jika Anda menemukannya.
Davide Orazio Montersino
1
Saya suka ini, meskipun -pargumen membuat cek tidak perlu. Anda masih dapat menggunakannya ketika Anda tidak ingin menggunakannya -p, yaitu ketika Anda tidak ingin semua direktori induk dibuat secara otomatis.
ADTC
3
Sebenarnya lebih pendek untuk menulis [ -d /path/to/dir ] || mkdir /path/to/dir.. sisi kanan dieksekusi ketika sisi kiri salah.
ADTC
4

Saya pikir Anda harus memformat ulang kode Anda sedikit:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
ivy
sumber