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.