มีวิธีการสร้างหลายไดเรกทอรีพร้อมกันด้วย mkdir หรือไม่?


112

หากฉันต้องการสร้างหลายไดเรกทอรี (ในระดับเดียวกัน) จากนั้นป้อนรายการชื่อไดเรกทอรีโดยคั่นด้วยเครื่องหมายจุลภาค (หรือบางสิ่งบางอย่างกับผลกระทบนั้น)


38
man mkdir....
Sparhawk

5
เมื่อใดก็ตามที่คุณต้องการทราบว่าคำสั่งสามารถทำสิ่งที่คุณต้องการให้พิมพ์manตามด้วยชื่อของคำสั่ง
David Richerby

@DavidRicherby แม้ว่าman mkdir"ชนิดของ" จะแสดงถึงความเป็นไปได้ในการสร้างไดเรกทอรีหลายรายการพร้อมกัน แต่ก็ไม่ได้กล่าวถึงโดยเฉพาะหรือวิธีการทำเช่นนั้น
Jacob Vlijm

2
@JacobVlijm GNU coreutils 8.21 manpage สำหรับ mkdir พูดว่า " NAME mkdir - สร้างไดเรกทอรี // SYNOPSIS mkdir [OPTION] ... [DIRECTORY] ... // DESCRIPTIONสร้าง DIRECTORY (IES) หากยังไม่มีอยู่" ดูเหมือนจะค่อนข้างชัดเจนว่าคุณสามารถสร้างมากกว่าหนึ่งไดเรกทอรี
David Richerby

9
@JacobVlijm ศัพท์แสงของ Man Man นั้นไม่ชัดเจนหากไม่มีคำสั่ง แต่ในภาษาทางเทคนิคของ man pages นั้นข้อมูลนั้นชัดเจนโดยสิ้นเชิงแม้จะอยู่ในใบเสนอราคาก็ตาม หมายเหตุ...หลัง[DIRECTORY]หมายถึงอาร์กิวเมนต์ที่สามารถทำซ้ำได้ ดังนั้นDIRECTORY(ies)หมายถึงDIRECTORYข้อโต้แย้งที่ส่งผ่านทั้งหมด อย่างไรก็ตามความคิดเห็น "RTFM" บางครั้งลืมว่ามีสัญลักษณ์ที่จะเรียนรู้
Blaisorblade

คำตอบ:


147

คำตอบสั้น ๆ

mkdir รับอาร์กิวเมนต์หลายตัวเพียงแค่เรียกใช้

mkdir dir_1 dir_2

152

คุณสามารถใช้รายการเพื่อสร้างไดเรกทอรีและสามารถรับค่อนข้างสวย

ตัวอย่างบางส่วนเพื่อให้คนคิดเกี่ยวกับมัน:

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 ไดเรกทอรีจาก sa1 ถึง sa50
  2. เหมือนกัน แต่แต่ละไดเรกทอรีจะเก็บ 50 ครั้ง sax1 ถึง sax50 (-p จะสร้างไดเรกทอรีหลักหากไม่มีอยู่
  3. 26 ไดเรกทอรีจาก a12345 ถึง z12345
  4. รายการที่คั่นด้วยเครื่องหมายจุลภาคทำให้ dirs 1, 2 และ 3
  5. 10 ไดเรกทอรีจากผ่านtest01test10
  6. เช่นเดียวกับ 4 แต่มีวันที่ปัจจุบันเป็นไดเรกทอรีและ 1,2,3 ในนั้น
  7. เช่นเดียวกับ 4 แต่มีผู้ใช้ปัจจุบันเป็นไดเรกทอรีและ 1,2,3 ในนั้น

ดังนั้นถ้าฉันเข้าใจถูกต้องและคุณต้องการสร้างบางไดเรกทอรีและภายในไดเรกทอรีใหม่คุณสามารถทำได้:

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

และรับ sa1, sa2, ... , sa10 และภายในแต่ละ dirs 1, 2 และ 3


ฉันเห็นด้วยกับ @ gniourf_gniourf ... ไม่มีการแสดงออกปกติในคำตอบของคุณ คุณหมายถึงพูดอย่างอื่นหรือให้ตัวอย่างอื่นหรือไม่
Slipp D. Thompson

1
@gniourf_gniourf ทำ :)
Rinzwind

3
เป็นมูลค่าการกล่าวขวัญว่าการขยายรั้งในไม่ได้กำหนดไว้ในเปลือก POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/ ......ตัวอย่างเช่นมันจะไม่ทำงานdashซึ่งเป็นค่าเริ่มต้น/bin/shบน Ubuntu
pabouk

7
คำตอบนี้ขึ้นอยู่กับเปลือกทำการขยายตัวของการป้อนข้อมูลของคุณก่อนที่จะให้การป้อนข้อมูลที่เป็นข้อโต้แย้งที่จะ mkdir มันแม่นยำมากกว่านี้เพียงแค่บอกว่า mkdir สามารถสร้าง dirs หลายตัวพร้อมกับข้อโต้แย้งหลาย ๆ อันแล้วพูดคุยกันว่าเชลล์ที่ให้มานั้นสามารถทำให้มันง่ายขึ้นได้อย่างไร
deed02392

ถ้าฉันพยายามทำบางอย่างmkdir sa$(seq 0.1 0.1 1)มันก็แค่สร้างไดเรกทอรีหนึ่งชื่อ sa0.1 และส่วนที่เหลือ 0.2, 0.3, ... , 1 ฉันจะได้รับการขยายฐานสิบโดยไม่ต้องเขียนรายการทั้งหมดได้อย่างไร
ฐานของ

26

มันง่ายมากช่วยให้คุณต้องการสร้างโครงสร้างไดเรกทอรีเช่น:

Websites/
  static/
      cs
      js
  templates/
      html

คุณสามารถทำได้ในคำสั่งเดียวเช่นนี้:

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

ระวังอย่าป้อนช่องว่างใด ๆ


นอกจากนี้คุณยังสามารถกดแท็บที่นี่เพื่อขยายก่อนเรียกใช้คำสั่ง
Isaac Gregson

14

ทำรายการชื่อสำหรับไดเรกทอรีที่คุณต้องการโดยใช้ตัวแบ่งบรรทัดแทนเครื่องหมายจุลภาคเป็นตัวคั่น บันทึกรายการนั้น

mkdir `cat list`

ตอนนี้คุณควรมีไดเรกทอรีทั้งหมดที่มีชื่อในรายการของคุณ


1
ใช่ว่าจะใช้งานได้กับ caveat - ชื่อไดเรกทอรีจะต้องมีทั้งสตริง หากหนึ่งบรรทัดspaced dirนั้นจะสร้างspaceddir สองอันและ `dir
Sergiy Kolodyazhnyy

ใช่ - คุณไม่สามารถแม้แต่จะประสบความสำเร็จทำชนิดของการหลบหนีสำหรับพื้นที่ใด ๆ ทั้ง - junk\ dirในlistไฟล์ให้สองไดเรกทอรีและjunk\ dirทำให้ฉันตกใจเมื่อเห็นชื่อ\ ในไดเรกทอรี
Jon V

ซึ่งสามารถนำมารวมกับ-pธงที่กล่าวถึงในคำตอบอื่น ๆ ถ้าเป็นเช่นนั้นlistไฟล์ไม่จำเป็นต้องรวมไดเรกทอรีหลักเป็นบรรทัดของตัวเองพวกเขาจะถูกตรวจพบและสร้างขึ้นโดยอัตโนมัติ
mcw0933

8

อะไรแบบนี้? (ขอบคุณ muru สำหรับคำprintfแนะนำ)

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

คุณสามารถห่อมันเป็นฟังก์ชั่นเพื่อความสะดวกในการใช้งาน:

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

1
เพียงแค่printf "%s" "$1" | xargs -d, mkdirควรจะเพียงพอ
muru

7

ดังนั้นคุณต้องการคั่นรายการชื่อไดเรกทอรีด้วยเครื่องหมายจุลภาคหรือไม่ ที่สามารถทำได้

Shell + coreutils

เนื่องจากทุกคนโพสต์ oneliners นี่เป็นของฉันเช่นกัน (การทดแทนพารามิเตอร์ mkdir + บวกการเปลี่ยนเส้นทางเชลล์ +)

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 เป็นภาษาการประมวลผลข้อความ แต่มีsystem()ฟังก์ชั่นที่ดีมากซึ่งจะเรียกเชลล์เริ่มต้นและเรียกใช้คำสั่ง [s] ที่อยู่ในวงเล็บ (ซึ่งต้องเป็นสตริง)

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

หรือคุณอาจลบ,ด้วยgsub()ฟังก์ชั่นและการโทรsystem("mkdir "$0)แต่นั่นอาจเป็นปัญหาหากคุณต้องการสร้างไดเรกทอรีที่มีช่องว่างในชื่อ

หลาม

วิธี Pythonic ของการทำเช่นเดียวกันคือการอ่านแต่ละบรรทัดกำจัดการลาก\nดันทุกอย่างในรายการเดียวและวนซ้ำไอเท็มรายการและสร้าง dirs ต่อรายการ โปรดทราบว่าในตัวอย่างร้อง/home/xieerqi/dirList.txtเป็นเส้นทางแบบเต็มให้กับไฟล์ของฉันและเราทำขึ้นเส้นทางเต็มของแต่ละไดเรกทอรีใหม่โดยการเข้าร่วมสตริง/home/username/และชื่อ dir อ่านจากรายการ ทดแทนค่าของคุณเองตามความจำเป็น

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
ฉันไม่คิดว่าผู้ถามต้องการให้รายการถูกคั่นด้วยเครื่องหมายจุลภาค ฉันค่อนข้างแน่ใจว่านั่นเป็นเพียงการคาดเดาของพวกเขาในสิ่งที่อาจเป็นไวยากรณ์
David Richerby

โอพีอาจจะไม่ได้มีรายการที่คั่นด้วยเครื่องหมายจุลภาค แต่แน่นอนว่าอาจใช้เป็นวิธีชี้ว่า "สามารถใช้รายการได้เช่นกันคุณไม่ต้องพิมพ์ชื่อของแต่ละ dir แยกกัน" dir{1..1000}โดยเฉพาะอย่างยิ่งที่จะเป็นประโยชน์เมื่อรายการใหญ่ไม่สามารถสร้างที่มีช่วงเช่น สมมติว่าคุณต้องการสร้างไดเรกทอรีตามชื่อผู้ใช้หรือต่อโครงการหรือตามที่ตั้งทางภูมิศาสตร์เช่นเมือง
Sergiy Kolodyazhnyy

1

คำสั่ง mkdir รับอาร์กิวเมนต์หลายตัวโดยเรียกใช้ดังนี้

mkdir dir1 dir2 dir3 ... dirN

หากคุณต้องการสร้างหลายไดเรกทอรีย่อยคุณสามารถผ่านอาร์กิวเมนต์เหล่านั้นใน {} ดังที่แสดงด้านล่าง (ใช้เครื่องหมายจุลภาคเท่านั้นเพื่อแยกอาร์กิวเมนต์โดยไม่มีช่องว่าง)

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.