Apakah ada cara untuk membuat banyak direktori sekaligus dengan mkdir?

112

Jika saya ingin membuat beberapa direktori (pada level yang sama) dan kemudian memberinya daftar nama direktori yang dipisah koma (atau sesuatu untuk efek itu)?

BGroat
sumber
38
man mkdir....
Sparhawk
5
Kapan saja Anda ingin tahu apakah suatu perintah dapat melakukan sesuatu yang ingin Anda lakukan, ketik mandiikuti dengan nama perintah.
David Richerby
@ DavidRicherby meskipun man mkdir"semacam" menunjukkan kemungkinan untuk membuat beberapa direktori sekaligus, itu tidak disebutkan secara khusus, atau bagaimana melakukannya.
Jacob Vlijm
2
@JacobVlijm GNU coreutils 8.21 manual untuk mkdir mengatakan, " NAME mkdir - membuat direktori // SYNOPSIS mkdir [OPTION] ... [DIRECTORY] ... // DESCRIPTION Buat DIRECTORY (ies) jika belum ada." Tampaknya cukup jelas bahwa Anda dapat membuat lebih dari satu direktori.
David Richerby
9
@JacobVlijm Halaman manual jargon tidak jelas tanpa instruksi, tetapi dalam bahasa teknis halaman manual, info ini benar-benar jelas, bahkan dalam kutipan yang diberikan. Catat ...setelahnya [DIRECTORY], artinya argumen itu bisa diulang. Jadi DIRECTORY(ies)mengacu pada semua DIRECTORYargumen yang disahkan . Namun, komentar "RTFM" terkadang lupa ada notasi untuk dipelajari.
Blaisorblade

Jawaban:

147

Jawaban singkat

mkdir membutuhkan banyak argumen, jalankan saja

mkdir dir_1 dir_2
Yakub Vlijm
sumber
152

Anda dapat menggunakan daftar untuk membuat direktori dan itu bisa menjadi sangat liar.

Beberapa contoh untuk membuat orang berpikir tentang itu:

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. 50 direktori dari sa1 hingga sa50
  2. sama tetapi masing-masing direktori akan menampung 50 kali sax1 hingga sax50 (-p akan membuat direktori induk jika tidak ada.
  3. 26 direktori dari a12345 hingga z12345
  4. daftar yang dipisahkan koma membuat dir 1, 2 dan 3.
  5. 10 direktori dari test01hingga test10.
  6. sama dengan 4 tetapi dengan tanggal saat ini sebagai direktori dan 1,2,3 di dalamnya.
  7. sama dengan 4 tetapi dengan pengguna saat ini sebagai direktori dan 1,2,3 di dalamnya.

Jadi, jika saya memahaminya dengan benar dan Anda ingin membuat beberapa direktori, dan di dalamnya direktori baru, maka Anda bisa melakukan ini:

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

dan dapatkan sa1, sa2, ..., sa10 dan dalam setiap dir 1, 2 dan 3.

Rinzwind
sumber
Saya setuju dengan @ gniourf_gniourf… tidak ada penggunaan ekspresi reguler dalam jawaban Anda. Apakah Anda bermaksud mengatakan sesuatu yang lain, atau memberikan contoh yang berbeda?
Slipp D. Thompson
1
@ gniourf_gniourf selesai :)
Rinzwind
3
Perlu disebutkan bahwa penjepit ekspansi di tidak didefinisikan dalam shell POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/... Misalnya tidak akan berfungsi di dashmana merupakan default /bin/shdi Ubuntu.
pabouk
7
Jawaban ini tergantung pada shell yang melakukan ekspansi input Anda sebelum memberikan input itu sebagai argumen untuk mkdir . Jauh lebih akurat untuk hanya mengatakan bahwa mkdir dapat membuat banyak dir dengan beberapa argumen dan kemudian berbicara tentang bagaimana shell yang diberikan dapat membuatnya lebih mudah.
deed02392
Jika saya mencoba melakukan sesuatu seperti mkdir sa$(seq 0.1 0.1 1), yang dilakukannya hanyalah membuat satu direktori bernama sa0.1 dan sisanya 0,2, 0,3, ..., 1. Bagaimana saya bisa mendapatkan ekspansi kurung desimal tanpa menulis seluruh daftar?
Plinth
26

Ini sangat sederhana, memungkinkan Anda ingin membuat struktur direktori seperti:

Websites/
  static/
      cs
      js
  templates/
      html

Anda dapat melakukannya dalam satu perintah seperti ini:

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

Berhati-hatilah untuk tidak memasuki ruang apa pun

anas munir
sumber
Anda juga dapat menekan tab di sini untuk mengembangkannya sebelum menjalankan perintah.
Isaac Gregson
14

Buat daftar nama untuk direktori yang Anda inginkan menggunakan jeda baris alih-alih koma sebagai pemisah. Simpan daftar itu.

mkdir `cat list`

Anda sekarang harus memiliki semua direktori yang disebutkan dalam daftar Anda.

SpaceCadet
sumber
1
Ya, itu akan berhasil, bagaimanapun, dengan peringatan - nama direktori harus satu string utuh. Jika satu baris spaced dir, maka itu akan membuat dua spaceddir , dan `dir.
Sergiy Kolodyazhnyy
Ya - Anda bahkan tidak dapat berhasil melakukan segala jenis pelarian untuk ruang, baik - junk\ dirdalam listfile memberikan dua direktori, junk\ dan dir. Membuat saya panik ketika saya melihat \ nama direktori.
Jon V
Ini dapat dikombinasikan dengan -pbendera yang disebutkan dalam jawaban lain. Jika demikian, listfile tidak harus menyertakan direktori induk sebagai barisnya sendiri, mereka akan dideteksi dan dibuat secara otomatis.
mcw0933
8

Sesuatu seperti ini? (terima kasih kepada muru untuk printftipnya)

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

Anda dapat membungkusnya menjadi fungsi untuk kemudahan penggunaan:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
kos
sumber
1
Hanya printf "%s" "$1" | xargs -d, mkdirharus cukup.
muru
7

Jadi Anda ingin daftar nama direktori yang dipisahkan koma? Itu bisa dilakukan.

Shell + coreutils

Karena semua orang memposting oneliners, ini milik saya juga (mkdir + substitusi parameter plus + redirection shell).

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 adalah bahasa pemrosesan teks, tetapi memiliki system()fungsi yang sangat bagus yang akan memanggil shell default, dan menjalankan perintah [s] yang dilampirkan dalam tanda kurung (yang harus berupa string).

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

Atau Anda bisa menghapus ,dengan gsub()fungsi, dan memanggil system("mkdir "$0)tetapi itu mungkin menjadi masalah jika Anda ingin membuat direktori dengan spasi di namanya

Python

Cara Pythonic melakukan hal yang sama, akan membaca setiap baris, menyingkirkan tertinggal \n, mendorong semuanya menjadi satu daftar, dan beralih ke item daftar dan buat dirs per item daftar. Perhatikan bahwa pada contoh di bawah, /home/xieerqi/dirList.txtadalah path lengkap yang diberikan ke file saya, dan kami membuat path lengkap dari setiap direktori baru dengan menggabungkan string /home/username/dan nama dir dibaca dari daftar. Ganti nilai-nilai Anda sendiri seperlunya

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)
Sergiy Kolodyazhnyy
sumber
3
Saya tidak berpikir penanya benar-benar ingin daftar dipisahkan koma; Saya cukup yakin itu hanya dugaan mereka tentang sintaksis apa.
David Richerby
Yah, OP mungkin tidak benar-benar memiliki daftar yang dipisahkan koma, namun itu pasti dapat digunakan sebagai metode, karena "daftar dapat digunakan juga, Anda tidak perlu mengetik nama setiap dir secara individual". Terutama yang akan berguna ketika daftar besar tidak dapat dibuat dengan rentang, seperti dir{1..1000}. Katakanlah, Anda ingin membuat direktori per nama pengguna, atau per proyek, atau per lokasi geografis, seperti kota
Sergiy Kolodyazhnyy
1

Perintah mkdir mengambil beberapa argumen cukup jalankan seperti di bawah ini

mkdir dir1 dir2 dir3 ... dirN

Jika Anda ingin membuat beberapa subdirektori maka Anda dapat meneruskan argumen tersebut dalam {} seperti yang ditunjukkan di bawah ini (gunakan hanya koma untuk memisahkan argumen, tanpa spasi).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Vijay Sasvadiya
sumber