Sadece bir dir yoksa mkdir nasıl yapılır?


1987

AIX KornShell (ksh) altında çalıştırmak için bir kabuk komut dosyası yazıyorum. mkdirBir dizin oluşturmak için komutu kullanmak istiyorum . Ancak dizin zaten mevcut olabilir, bu durumda hiçbir şey yapmak istemiyorum. Bu yüzden ya dizinin mevcut olmadığını görmek için test etmek ya da mkdirvarolan bir dizin oluşturmaya çalıştığında "Dosya var" hatasını bastırmak istiyorum .

Bunun en iyi nasıl yapılacağına dair düşünceleriniz var mı?

Yanıtlar:


3294

Deneyin mkdir -p:

mkdir -p foo

Bunun, var olmayan ara dizinleri de oluşturacağını unutmayın; Örneğin,

mkdir -p foo/bar/baz

dizinleri yaratacak foo, foo/barve foo/bar/bazonların var yoksa.

GNU gibi bazı uygulama mkdirdahil mkdir --parentsbir daha okunabilir takma ad olarak, ancak kaçınılmalıdır nedenle bu, POSIX / Tek Unix Şartnamede belirtilmeyen ve MacOS, çeşitli BSD ve çeşitli ticari Unix'ler gibi birçok ortak platformlarda kullanılabilir değildir.

Üst dizinler olmadığında bir hata istiyorsanız ve yoksa dizini oluşturmak istiyorsanız, önce dizinin testvarlığı için şunları yapabilirsiniz :

[ -d foo ] || mkdir foo

11
kullandığınız kısaltılmış örnek, tam olarak yapmamanız gereken şeydir. Kodlama alanından tasarruf etmek mantığı tersine çeviriyor ama kullanmalı! ve && ve onu okuyanlara daha anlamlı gelsin.
Mike Q

16
@AndreasLarsen Bu soru mkdirWindows'ta değil, Unix benzeri sistemlerle ilgilidir. -pPOSIX / Tek Unix Spesifikasyonu uyumluluğu için gereklidir, bu nedenle bu spesifikasyonlara uymayı amaçlayan her şey desteklenir -p. Cygwin veya MSYS gibi bir POSIX öykünme katmanı kullanmadığınız sürece Windows tamamen farklıdır.
Brian Campbell

22
Bugün ilginç bir şey keşfettim mkdir -p, parantez kullanabilirsiniz! {}bir komutta "karmaşık" dizin ağacı oluşturmak için. Buraya bakın: technosophos.com/2010/04/15/…
herve

12
@MikeQ Ben tercih ederim ||yerine &&sonra tüm çizgi sağ çıkış durumu vardır çünkü. Kabuğunuz ile çalışıyorsa errexitveya bu satır bir işlevdeki son satırsa, anahtar-durum, ne olursa olsun önemlidir.
rudimeier

9
@herve Bunun bir ilgisi yok mkdir; kabuk böyle bir ifadeyi iletilen bağımsız bir argüman listesine genişletir mkdir.
chepner

176

Bu çalışmalı:

$ mkdir -p dir

veya:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

dizini yoksa oluşturur, ancak oluşturmaya çalıştığınız dizinin adı zaten bir dizin dışında bir şey tarafından kullanılıyorsa sizi uyarır.


Korn'da bir -d operatörü olduğunu düşünmüyorum, bunun yerine -e hem dosyalar / dizinler için kullanılıyor hem de sadece varlığı kontrol ediyor. Ayrıca, hepsi başarı üzerine 0 döndürür, yani! gereksizdir. Yanlışsam düzelt.
alkar

1
her iki açıdan da yanlış, AFAIK. Testler dönmek gerçek başarıyı ve -d (en azından MacOS X'te) çok var
Alnitak

5
bunun iş parçacığı açısından güvenli olmadığını belirtmek gerekir. dizinin var olup olmadığını kontrol ettiğiniz zaman ile yazmaya çalıştığınız zaman arasında bir şeyler değişebilir.
Justin L.


73

Tek komutla karmaşık dizin ağaçlarını tanımlama

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

hata yoksa, üst dizinleri gerektiği gibi yapın
Fedir RYKHTIK

18
Bunun mkdirkendisinin bir özelliği değil , komutu yürüten kabuk olduğunu unutmayın. Buna küme ayracı genişletme denir - AFAIK, sadece Bash, ksh, zsh ve C kabuğu bunu destekler.
Daniel Kamil Kozar

3
virgüllerin çevresinde boşluklar varsa, beklenmedik sonuç alabilirsiniz. Dikkat.
Atlas7

1
@ Atlas7, normalde normal ifadenin parçası olan karakterlerden kaçmanız gerektiğini belirtti. (yani kullanmak yerine kullanmanız folder namegerekir folder\ name)
John Hamilton

1
Bu bir cevap değil; bu, yorum olarak daha uygun olacak ayrı bir konudur.
Chris Page

40

Herhangi bir hata mesajı göstermek istemiyorsanız:

[ -d newdir ] || mkdir newdir

Kendi hata mesajınızı göstermek istiyorsanız:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

20

Eski denenmiş ve gerçek

mkdir /tmp/qq >/dev/null 2>&1

diğer birçok çözümün sahip olduğu yarış koşullarının hiçbiri ile istediğinizi yapacaksınız.

Bazen en basit (ve en çirkin) çözümler en iyisidir.


5
"Tmp" yoksa bu başarısız olur. size herhangi bir onay vermez.
Mike Q

15

mkdir foodizin mevcut olsa bile çalışır. Yalnızca "foo" adlı dizin mevcut değilse, çalışması için -pbayrağı kullanmayı deneyin .

Misal :-

mkdir -p foo

Bu, yalnızca yoksa "foo" adlı dizini oluşturur. :)


2
@BrianCampbell tarafından belirtildiği gibi, bu yoldaki diğer dizinleri de oluşturur. Bağlama noktasında dizinler oluşturabileceğinden, örneğin bir birimin bağlantısı kesilirse bu tehlikeli olabilir.
uliwitness

11
directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi

10

Veya önce varlığını kontrol etmek istiyorsanız:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e korn kabuğu için var olan testtir.

Ayrıca bir korn shell el kitabını aramayı da deneyebilirsiniz.


10

mkdir, Windows 8+ sistemlerde artık -p anahtarını desteklememektedir.

Bunu kullanabilirsiniz:

IF NOT EXIST dir_name MKDIR dir_name

10
OP AIX kornshell hakkındaydı ... Windows ile ilgisi yok, değil mi?
J. Chomel

9

man mkdirSeçenek için kılavuz sayfasına bakınız -p

   -p, --parents
          no error if existing, make parent directories as needed

belirli bir yoldaki tüm dizinleri oluşturur, eğer varsa hata alamazsa, aksi takdirde belirtilen yolda soldan sağa tüm dizinleri oluşturur. Aşağıdaki komutu deneyin. dizinleri içerir newdirve anotherdirbu komutu vermeden önce mevcut değildir

doğru kullanım

mkdir -p /tmp/newdir/anotherdir

Komutu uyguladıktan sonra / tmp altında görebilirsiniz newdirve anotherdiroluşturulabilir. Bu komutu istediğiniz kadar tekrarlayabilirsiniz, komut her zaman vardır exit(0). Bu nedenle, çoğu insan bu komutları bu gerçek yolları kullanmadan önce kabuk komut dosyalarında kullanır.


8

Dizin olup olmadığını kontrol etmek için if döngüsünü, dizini oluşturmaktan çıkmıyorsa kullanabilirsiniz.

1) dir = / home / dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2) Bir dizin oluşturmak için mkdir komutunu -p seçeneğiyle kullanabilirsiniz. Dizinin kullanılabilir olup olmadığını kontrol eder.

mkdir -p $dir

mkdir -p dizinin ağaç yapısının oluşturulmasına da izin verir. Aynı komutu kullanarak üst ve alt dizinleri oluşturmak istiyorsanız, mkdir -p

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

İf döngüsünü kullanmanın herhangi bir avantajı var mı? Neden birisi bu aşırı -p seçeneğini seçsin ki ?!
pedram bashiri

1
Bir klasör olmadığında klasör oluşturmanın yollarını paylaştım. Birinin ihtiyacına bağlıdır. Klasörün bulunup bulunmadığını kontrol etmeniz gereken bir kullanım durumunuz varsa ve bunu takip etmek istiyorsanız, böylece çözüm 1 ile devam edebilirsiniz. Sorun yoksa, çözüm 2 ile gidebilirsiniz, klasörü oluşturacaktır yoksa.
AbhinavVaidya8

Bir döngü görmedim.
Amit Naidu

3

Bu, yoksa bir dizin oluşturmanızı sağlayan basit bir işlevdir (bash kabuğu).

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

Yukarıdaki işlevi şu şekilde çağırabilirsiniz:

createDirectory / tmp / fooDir / BarDir

Yukarıdakiler yoksa fooDir ve BarDir oluşturur. Mkdir komutunda dizinleri özyinelemeli olarak oluşturan "-p" seçeneğini not alın. Bu yardımcı olur umarım.


2
mkdir -p sam
  • mkdir = Dizin Oluştur
  • -p = - ebeveynler
  • (varsa hata yok, gerektiğinde üst dizinler oluşturun)

2
if [ !-d $dirName ];then
     if ! mkdir $dirName; then  # Shorter version. Shell will complain if you put braces here though
     echo "Can't make dir: $dirName"
     fi
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.