Có cách nào để tạo nhiều thư mục cùng một lúc với mkdir không?


112

Nếu tôi muốn tạo nhiều thư mục (ở cùng cấp độ) và sau đó cung cấp cho nó một danh sách tên thư mục được phân tách bằng dấu phẩy (hoặc một cái gì đó để có hiệu lực đó)?


38
man mkdir....
Sparhawk

5
Bất cứ lúc nào bạn muốn biết nếu một lệnh có thể làm một số điều bạn muốn thực hiện, hãy nhập mantheo tên của lệnh.
David Richerby

@DavidR Richby mặc dù man mkdir"loại" cho thấy khả năng tạo nhiều thư mục cùng một lúc, nó không được đề cập cụ thể cũng như làm thế nào để làm điều đó.
Jacob Vlijm

2
@JacobVlijm Trang chủ GNU coreutils 8.21 cho mkdir nói, " NAME mkdir - tạo thư mục // SYNOPSIS mkdir [TÙY CHỌN] ... [ TRỰC TIẾP ] ... // MÔ TẢ Tạo TRỰC TIẾP (ies) nếu chúng chưa tồn tại." Điều đó có vẻ khá rõ ràng rằng bạn có thể tạo nhiều hơn một thư mục.
David Richerby

9
@JacobVlijm Thuật ngữ trang con người không rõ ràng nếu không có hướng dẫn, nhưng trong ngôn ngữ kỹ thuật của trang người đàn ông, thông tin hoàn toàn rõ ràng, ngay cả trong trích dẫn đã cho. Lưu ý ...sau [DIRECTORY], có nghĩa là đối số có thể được lặp lại. Vì vậy, DIRECTORY(ies)đề cập đến tất cả các DIRECTORYđối số thông qua . Tuy nhiên, bình luận "RTFM" đôi khi quên rằng có một ký hiệu để tìm hiểu.
Blaisorblade

Câu trả lời:


147

Câu trả lời ngắn

mkdir mất nhiều đối số, chỉ cần chạy

mkdir dir_1 dir_2

152

Bạn có thể sử dụng danh sách để tạo thư mục và nó có thể trở nên khá hoang dã.

Một số ví dụ để khiến mọi người nghĩ về nó:

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 thư mục từ sa1 đến sa50
  2. tương tự nhưng mỗi thư mục sẽ chứa 50 lần sax1 đến sax50 (-p sẽ tạo thư mục mẹ nếu chúng không tồn tại.
  3. 26 thư mục từ a12345 đến z12345
  4. danh sách được phân tách bằng dấu phẩy làm cho thư mục 1, 2 và 3.
  5. 10 thư mục từ test01thông qua test10.
  6. giống như 4 nhưng với ngày hiện tại là một thư mục và 1,2,3 trong đó.
  7. giống như 4 nhưng với người dùng hiện tại là một thư mục và 1,2,3 trong đó.

Vì vậy, nếu tôi hiểu chính xác và bạn muốn tạo một số thư mục, và trong đó có các thư mục mới, thì bạn có thể làm điều này:

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

và nhận sa1, sa2, ..., sa10 và trong mỗi thư mục 1, 2 và 3.


Tôi đồng ý với @ gniourf_gniourf 'không có cách sử dụng biểu thức chính quy trong câu trả lời của bạn. Bạn có ý định nói điều gì khác, hoặc đưa ra một ví dụ khác?
Slipp D. Thompson

1
@gniourf_gniourf đã hoàn thành :)
Rinzwind

3
Điều đáng nói là việc mở rộng dấu ngoặc không được xác định trong trình bao POSIX: pubs.opengroup.org/onlinepub/9699919799/utilities/. Ví dụ, nó sẽ không hoạt động trong dashđó là mặc định /bin/shtrên Ubuntu.
pabouk

7
Câu trả lời này phụ thuộc vào trình bao thực hiện mở rộng đầu vào của bạn trước khi cung cấp đầu vào đó làm đối số cho mkdir . Chính xác hơn nhiều khi chỉ nói rằng mkdir có thể tạo ra nhiều thư mục với nhiều đối số và sau đó nói về cách một lớp vỏ nhất định có thể làm cho điều đó dễ dàng hơn.
deed02392

Nếu tôi cố gắng làm một cái gì đó như mkdir sa$(seq 0.1 0.1 1), tất cả những gì nó làm là tạo một thư mục có tên sa0.1 và phần còn lại 0,2, 0,3, ..., 1. Làm cách nào tôi có thể mở rộng dấu ngoặc thập phân mà không cần viết toàn bộ danh sách?
Plinth

26

Nó rất đơn giản, cho phép bạn muốn tạo một cấu trúc thư mục như:

Websites/
  static/
      cs
      js
  templates/
      html

Bạn có thể làm điều đó trong một lệnh như thế này:

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

Cẩn thận không vào bất kỳ chỗ trống nào


Bạn cũng có thể nhấn tab ở đây để mở rộng chúng trước khi chạy lệnh.
Isaac Gregson

14

Tạo một danh sách các tên cho các thư mục mong muốn của bạn bằng cách sử dụng dấu ngắt dòng thay vì dấu phẩy làm dấu phân cách. Lưu danh sách đó.

mkdir `cat list`

Bây giờ bạn sẽ có tất cả các thư mục có tên trong danh sách của bạn.


1
Vâng, điều đó sẽ làm việc, tuy nhiên, với một cảnh báo - tên thư mục phải là một chuỗi toàn bộ. Nếu một dòng là spaced dir, thì nó sẽ tạo ra hai spaceddir và `dir.
Sergiy Kolodyazhnyy

Vâng - bạn thậm chí không thể thực hiện thành công bất kỳ loại thoát nào cho khoảng trắng, - junk\ dirtrong listtệp cung cấp hai thư mục junk\ dir. Đã cho tôi một hoảng loạn khi tôi thấy một \ trong một thư mục tên.
Jon V

Điều này có thể được kết hợp với -pcờ được đề cập trong các câu trả lời khác. Nếu vậy, listtệp không phải bao gồm các thư mục mẹ là dòng riêng của chúng, chúng sẽ được phát hiện và thực hiện tự động.
mcw0933

8

Một cái gì đó như thế này? (nhờ muru cho tiền printfboa)

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

Bạn có thể gói nó thành một chức năng để dễ sử dụng:

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

1
Chỉ printf "%s" "$1" | xargs -d, mkdircần là đủ.
muru

7

Vì vậy, bạn muốn danh sách tên thư mục được phân tách bằng dấu phẩy? Điều đó có thể được thực hiện.

Vỏ + lõi

Vì tất cả mọi người đang đăng oneliners, đây cũng là của tôi (mkdir + thay thế tham số cộng với + chuyển hướng 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 là một ngôn ngữ xử lý văn bản, nhưng nó có system()chức năng rất hay sẽ gọi shell mặc định và chạy lệnh [s] được đặt trong ngoặc đơn (phải là một chuỗi).

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

Hoặc bạn có thể xóa ,bằng gsub()hàm và gọi system("mkdir "$0)nhưng đó có thể là vấn đề nếu bạn muốn tạo thư mục có khoảng trắng trong tên của chúng

Con trăn

Cách làm tương tự của Pythonic là đọc từng dòng, thoát khỏi dấu vết \n, chuyển mọi thứ vào một danh sách và lặp lại các mục trong danh sách và tạo thư mục trên mỗi mục danh sách. Lưu ý rằng trong ví dụ dưới đây, /home/xieerqi/dirList.txtlà đường dẫn đầy đủ được cung cấp cho tệp của tôi và chúng tôi tạo thành đường dẫn đầy đủ của mỗi thư mục mới bằng cách nối chuỗi /home/username/và tên thư mục đọc từ danh sách. Thay thế các giá trị của riêng bạn khi cần thiết

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
Tôi không nghĩ người hỏi thực sự muốn danh sách được phân tách bằng dấu phẩy; Tôi khá chắc chắn rằng đó chỉ là phỏng đoán của họ về cú pháp có thể là gì.
David Richerby

Chà, OP có lẽ không có chính xác danh sách được phân tách bằng dấu phẩy, tuy nhiên chắc chắn nó có thể được sử dụng như một phương thức, điểm là "danh sách cũng có thể được sử dụng, bạn không phải gõ tên của từng thư mục riêng lẻ". Đặc biệt là sẽ hữu ích khi một danh sách lớn không thể được tạo ra với các phạm vi, như dir{1..1000}. Giả sử, bạn muốn tạo một thư mục cho mỗi tên người dùng, hoặc mỗi dự án hoặc theo vị trí địa lý, như một thành phố
Sergiy Kolodyazhnyy

1

Lệnh mkdir có nhiều đối số chỉ đơn giản là chạy như dưới đây

mkdir dir1 dir2 dir3 ... dirN

Nếu bạn muốn tạo nhiều thư mục con thì bạn có thể chuyển các đối số đó trong {} như được hiển thị bên dưới (chỉ sử dụng dấu phẩy để phân tách đối số, không có khoảng trắng).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.