Mkdir ile aynı anda birden fazla dizin oluşturmanın bir yolu var mı?


112

Birden fazla dizin (aynı seviyede) oluşturmak ve ardından virgülle ayrılmış dizin adları listesi (veya bu etkiye yönelik bir şey) beslemek istersem?


38
man mkdir....
Sparhawk

5
Bir komutun yapmak istediğiniz bir şeyi yapıp yapamayacağını bilmek istediğiniz zaman, manardından komutun adını yazın.
David Richerby

@DavidRicherby man mkdir"tür" bir kerede birden fazla dizin yaratma olasılığını öne sürse de, özel olarak belirtilmemiştir ve bunun nasıl yapılacağı belirtilmemiştir.
Jacob Vlijm

2
@JacobVlijm GNU coreutils mkdir için 8.21 manpage, " NAME mkdir - dizinleri hazırla // SYNOPSIS mkdir [OPTION] ... [DIRECTORY] ... // AÇIKLAMA DIRECTORY (ies) zaten mevcut değilse" diyor. Birden fazla dizin yapabileceğinizi açıkça görüyorsunuz.
David Richerby

9
@JacobVlijm Man sayfaları jargonu talimat olmadan açık değildir, ancak man sayfalarının teknik dilinde, verilen alıntıda bile bilgi tamamen açıktır. Not ...SONRA [DIRECTORY]argümanı tekrar edilebilir, yani. Yani DIRECTORY(ies)geçen tüm DIRECTORYargümanlara atıfta bulunur . Ancak, "RTFM" yorumları bazen öğrenilecek bir gösterim olmadığını unutur.
Blaisorblade

Yanıtlar:


147

Kısa cevap

mkdir Birden fazla argüman alır, sadece çalıştır

mkdir dir_1 dir_2

152

Dizinler oluşturmak için listeleri kullanabilirsiniz ve oldukça vahşileşebilir.

İnsanların düşünmesini sağlamak için bazı örnekler:

mkdir sa{1..50}
mkdir -p sa{1..50}/sax{1..50}
mkdir {a-z}12345 
mkdir {1,2,3}
mkdir test{01..10}
mkdir -p `date '+%y%m%d'`/{1,2,3} 
mkdir -p $USER/{1,2,3} 
  1. Sa1'den sa50'ye kadar 50 dizin
  2. aynıdır ancak dizinlerin her biri 50 kez saks1'den sax50'ye 50 kez tutacaktır (-p yoksa, üst dizinleri yaratacaktır.
  3. A12345'ten z12345'e kadar 26 dizin
  4. virgülle ayrılmış liste, 1, 2 ve 3 dizinlerini yapar.
  5. test01İçinden 10 dizin test10.
  6. 4 ile aynı fakat bir dizin olarak geçerli tarih ve içinde 1,2,3 ile.
  7. 4 ile aynıdır, fakat mevcut kullanıcı bir dizin olarak ve 1,2,3'tür.

Öyleyse, doğru anladıysam ve bazı dizinler oluşturmak istiyorsan ve içlerinde yeni dizinler oluşturmak istiyorsan, bunu yapabilirsin:

mkdir -p sa{1..10}/{1,2,3}

ve sa1, sa2, ..., sa10'u ve her 1, 2 ve 3 direklerini içine alın.


@ Gniourf_gniourf ile aynı fikirdeyim… cevabınızda düzenli ifadeler kullanılamaz. Başka bir şey mi söylemek ya da farklı bir örnek vermek mi istediniz?
Slipp D. Thompson,

1
@gniourf_gniourf yapılır :)
Rinzwind

3
POSIX kabuğunda tanımlanmayan ayraç genişlemesinden bahsetmeye değer: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Örneğin Ubuntu’da dashvarsayılan olan çalışmaz /bin/sh.
pabouk

7
Bu cevap, bu girişi mkdir argümanları olarak sağlamadan önce girişinizi genişleten kabuğa bağlıdır . Sadece mkdir'in çoklu argümanlarla çoklu direkler yaratabildiğini ve daha sonra verilen bir kabuğun bunu nasıl daha kolaylaştırabileceğinden bahsetmek çok daha doğru .
deed02392

Gibi bir şey yapmaya çalışırsam mkdir sa$(seq 0.1 0.1 1), tek yaptığı sa0.1 adında bir dizin ve 0.2, 0.3, ..., 1 numaralı diğer dizinleri oluşturmaktır. Listenin tamamını yazmadan ondalık ayraç genişletmeyi nasıl alabilirim?
Süpürgelikler

26

Çok basit, gibi bir dizin yapısı oluşturmak istediğiniz sağlar:

Websites/
  static/
      cs
      js
  templates/
      html

Bunu böyle tek bir komutla yapabilirsiniz:

mkdir -p Website/{static/{cs,js},templates/html}

Boşluk girmemeye dikkat edin


Komutu çalıştırmadan önce bunları genişletmek için sekmeye de basabilirsiniz.
Isaac Gregson

14

Ayırıcı olarak virgül yerine satır sonlarını kullanarak, istediğiniz dizinlerin adlarının bir listesini yapın. Bu listeyi kaydet.

mkdir `cat list`

Şimdi listenizdeki tüm dizinlere sahip olmalısınız.


1
Evet, ancak bu bir ihtarla işe yarayacak - dizin isimleri bir bütün dizge olmalı. Bir satır ise spaced dir, iki spaceddir ve `dir.
Sergiy Kolodyazhnyy

Evet - - hatta başarılı ya alanlar için kaçan her türlü yapamaz junk\ diriçinde listdosyanın iki dizinleri verir junk\ ve dir. \ Dizin isminde bir panik gördüm .
Jon V,

Bu, -pdiğer cevaplarda belirtilen bayrakla birleştirilebilir . Öyleyse, listdosya üst dizinleri kendi satırları olarak dahil etmek zorunda kalmaz, otomatik olarak algılanır ve yapılır.
mcw0933

8

Böyle bir şey mi? ( printfbahşiş için muru sayesinde )

printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
$ printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
bar  baz  foo
$ 

Kullanım kolaylığı için bir işleve sarabilirsiniz:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 

1
Sadece bir printf "%s" "$1" | xargs -d, mkdiryeterli olmalı.
muru

7

Yani dizinde virgülle ayrılmış dizin isimleri listesi istiyorsunuz Bu yapılabilir.

Shell + coreutils

Herkes oneliner yayınladığı için, işte benimki de (mkdir + parametre değiştirme artı + kabuk yönlendirme).

DIR:/testdir
skolodya@ubuntu:$ ls

DIR:/testdir
skolodya@ubuntu:$ mkdir $( tr '[,\n]' ' '   < /home/xieerqi/dirList.txt   )                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

AWK

AWK bir metin işleme dilidir, ancak system()varsayılan kabuğu çağıracak ve parantez içine alınmış [s] komutunu çalıştıracak çok güzel bir işlevi vardır (bir dize olmalıdır).

DIR:/xieerqi
skolodya@ubuntu:$ awk -F ',' '{for(i=1;i<=NF;i++) system("mkdir "$i)}' dirList.txt                                    

DIR:/xieerqi
skolodya@ubuntu:$ ls -ld dir*                                                                                         
-rw-rw-r-- 1 xieerqi xieerqi   23 Feb  9 11:41 dirList.txt
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirone/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirthree/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirtwo/

DIR:/xieerqi
skolodya@ubuntu:$ cat dirList.txt                                                                                     
dirone,dirtwo,dirthree

Ya ,da gsub()işlevini kaldırabilir ve çağırabilir system("mkdir "$0)ancak adlarında boşluk içeren dizinler oluşturmak istiyorsanız sorun olabilir.

piton

Aynı şeyi yapmanın Pythonic yolu, her satırı okumak \n, izlemekten kurtulmak, her şeyi tek bir listeye sürmek ve liste öğeleri üzerinde yineleme yapmak ve liste öğesi başına dizin oluşturmak olacaktır. Aşağıdaki örnekte, dosyama /home/xieerqi/dirList.txtverilen tam yol olduğunu ve her yeni dizinin tam yolunu dizeye /home/username/ve listeden okunan dir adı birleştirerek oluşturduğumuza dikkat edin. Gerektiği gibi kendi değerlerinizi değiştirin

DIR:/testdir
skolodya@ubuntu:$ ls                                                                                                  

DIR:/testdir
skolodya@ubuntu:$ /home/xieerqi/makeDirs.py                                                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

DIR:/testdir
skolodya@ubuntu:$ cat /home/xieerqi/makeDirs.py
#!/usr/bin/env python
import os
with open("/home/xieerqi/dirList.txt") as file:
   for line in file:
         for directory in line.strip().rsplit(','):
             path = '/home/xieerqi/testdir/' +  directory
             os.makedirs(path)

3
Askerin aslında listenin virgülle ayrılmasını istediğini sanmıyorum ; Bunun sözdiziminin ne olabileceği konusundaki tahminleri olduğuna eminim.
David Richerby

Öyleyse, OP muhtemelen tam olarak virgülle ayrılmış bir listeye sahip değildi, ancak bir yöntem olarak kullanılabileceğinden emin olabiliriz, "listeler de kullanılabilir, her bir dir'in adını ayrı ayrı yazmanız gerekmez". Özellikle, büyük bir liste gibi aralıklar ile oluşturulamadığında faydalı olacaktır dir{1..1000}. Diyelim ki, kullanıcı adı veya proje başına veya bir şehir gibi coğrafi bölgeye göre bir dizin oluşturmak istiyorsunuz
Sergiy Kolodyazhnyy

1

mkdir komutu basitçe aşağıdaki gibi çalıştırılan birden fazla argüman alır

mkdir dir1 dir2 dir3 ... dirN

Birden fazla alt dizin oluşturmak istiyorsanız, bu argümanı aşağıda gösterildiği gibi {} 'de aktarabilirsiniz (argümanı boşluk olmadan ayırmak için yalnızca virgül kullanın).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
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.