Zaten yoksa bir klasör oluşturmak için Bash nasıl kullanılır?


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

Bu işe yaramıyor gibi görünüyor. Biri yardım edebilir mi?


4
Neden noktalı virgül var?
— ADTC

1
;Belirteç böylece satır olduğunu, bir komut ayırıcı olduğunu. Gibi thenayrı bir komuttur, önceki noktalı virgül aynı çizgide yazmaya muktedir olması gereklidir. Sonra noktalı virgül mkdirve figereksiz.
— Andreas Riedmüller

Yanıtlar:


279

İlk olarak, bash "[" sadece son bir argüman olarak "]" dizesini bekleyen bir komuttur, bu nedenle kapanma ayracı öncesi boşluk (ve aynı zamanda iki ayrı argüman olması gereken "!" Ve "-d" arasındaki boşluk) de) önemlidir:

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

İkincisi, -p anahtarını kullandığınız için mkdir, bu kontrol işe yaramaz, çünkü bu ilk etapta bunu yapar. Sadece yaz:

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

ve bu kadar.


2
Not: -pbayrak gerekirse üst dizinlerin oluşturulmasına neden olur.
— Danijel

13
Tanrım, "[" nin bir emir olduğunu hiç bilmiyordum. Bu benim sorunlarımın çoğunu açıklıyor ... StackOverflow'da şimdiye kadar okuduğum en kullanışlı şey.
— Ben Kushigian

1
Vaov! "[" Nin bash'taki bir komut olduğunu bilmek böyle bir göz açıcıdır. Bash scriptlerimle ilgili birçok sorun çözüldü gibi hissediyorum!
— raluru

93

Aslında var olup olmadığını kontrol etmeye gerek yoktur. Varsa zaten oluşturmak istediğiniz için, sadece mkdir bunu yapar

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

2
Not: -pbayrak gerekirse üst dizinlerin oluşturulmasına neden olur.
— Danijel

67

Basitçe yapın:

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

Klasör zaten varsa mkdir hata verir. Hataları yoksaymak için şunu yazın:

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

Herhangi bir kontrol veya buna benzer bir şey yapmaya gerek yok.


Referans için:

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


3
Argüman -phataları tam olarak görmezden gelmez: mevcut olmayan herhangi bir yol bileşeninin oluşturulduğu farklı bir modu çağırır (dolayısıyla sıfırın oluşturulması gerektiğinde bir hata değildir). Davranış farklıdır, çünkü sonuncusundan farklı, istenebilecek veya istenmeyecek bileşenler oluşturacaktır.
— BeeOnRope

23

[Ve ]parantez içinde boşluklara ihtiyacınız vardır :

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

18

Daha temiz bir yol, kabuk mantıksal operatörlerinin kısayol değerlendirmesini kullanın. Operatörün sağ tarafı yalnızca sol taraf doğruysa yürütülür.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db

11
mmh, temiz değil: sadece daha kısa. Karşılaşırsanız böyle bir ifadenin anlamını anlamak zordur.
— Davide Orazio Montersino

1
-pTartışmayı gereksiz kılmasına rağmen, bunu beğendim . Kullanmak istemediğiniz zaman yine de kullanabilirsiniz -pne zaman olduğunu, istemiyoruz tüm üst dizinleri otomatik olarak oluşturulacak.
— ADTC

3
Aslında yazmak daha da kısadır [ -d /path/to/dir ] || mkdir /path/to/dir.. sağ taraf sol taraf yanlış olduğunda yürütülür.
— ADTC

4

Kodunuzu biraz yeniden biçimlendirmeniz gerektiğini düşünüyorum:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.