วิธีสร้างไดเร็กทอรีและให้สิทธิ์ในคำสั่งเดียว


108

จะสร้างไดเร็กทอรีและให้สิทธิ์ในคำสั่งเดียวใน Linux ได้อย่างไร

777ฉันต้องสร้างจำนวนมากของโฟลเดอร์ที่มีสิทธิ์เต็มรูปแบบ

คำสั่ง

mkdir path/foldername
chmod 777 path/foldername 

ฉันไม่ชอบสร้างและให้สิทธิ์ในสองคำสั่ง ฉันสามารถทำสิ่งนี้ในคำสั่งเดียวได้หรือไม่?


1
mkdir temp; chmod 777 tempคือหนึ่งบรรทัด คุณสามารถทำให้ 'temp' เป็นตัวแปรและบันทึกเป็นคำสั่ง bash นี่คือสิ่งที่คุณต้องการทำหรือไม่?
styfle

1
สวัสดี @ white-rose โปรดดูคำตอบล่าสุดควรเป็นคำตอบที่ยอมรับ โบนัสมันรวม mkdir, chmod และ chown ไว้ในกระสุนนัดเดียว!
Costin Gușă

คำตอบ:


205

ตามเพจคนของmkdir ...

mkdir -m 777 dirname

1
คุณช่วยบอกฉันเกี่ยวกับตัวเลือก -m ได้ไหม
poorani

ตัวเลือก @Whiterose -m สำหรับโหมด ตั้งค่าบิตสิทธิ์สำหรับไดเร็กทอรีที่สร้างขึ้นใหม่เป็นค่าที่ระบุโดยตัวแปร Mode ตัวแปร Mode ใช้ค่าเดียวกับพารามิเตอร์ Mode สำหรับคำสั่ง chmod ไม่ว่าจะอยู่ในรูปสัญลักษณ์หรือตัวเลข
TMKasun

15
mkdir -p -m เสียเนื่องจากโหมดนี้ใช้กับไดเร็กทอรีสุดท้ายในเส้นทางที่คุณพิมพ์เท่านั้น ตัวอย่างเช่น mkdir -p -m 707 one / two / three แม้ว่าทั้งสามไดเร็กทอรีจะถูกสร้างขึ้นใหม่ แต่ไดเร็กทอรีสุดท้ายเท่านั้นที่จะมีสิทธิ์ที่ร้องขอและไดเร็กทอรีอื่น ๆ เป็นค่าเริ่มต้น ติดตั้ง -d -m เสียในลักษณะเดียวกัน
ชื่อที่แสดง

นอกจากปัญหารอบตัว-pที่ @DisplayName ที่กล่าวไปแล้วข้างต้นยังมีอีกเรื่องหนึ่ง -mจะใช้เฉพาะในกรณีที่ไดเรกทอรีถูกสร้างขึ้นจริง หากมีอยู่แล้วโหมดจะไม่เปลี่ยนแปลง ขึ้นอยู่กับบริบทของคุณสิ่งนี้อาจดีหรือไม่ดี
Adam Badura

1
mkdir -m777 directory
Hugo Deiró

19
install -d -m 0777 /your/dir

ควรให้สิ่งที่คุณต้องการ โปรดทราบว่าผู้ใช้ทุกคนมีสิทธิ์เขียนเพิ่มและลบไฟล์ในไดเร็กทอรีนั้น


1
โบนัสคุณยังสามารถเพิ่ม -g และ / หรือ -o และคุณสามารถมี mkdir, chmod และ chown ได้ในนัดเดียว!
Costin Gușă

4
มันแตก. ติดตั้ง -d -m 070 หนึ่ง / สอง / สาม แม้ว่าทั้งสามไดเร็กทอรีในพา ธ จะถูกสร้างขึ้นใหม่ แต่ไดเร็กทอรีสุดท้ายเท่านั้นที่จะมีการตั้งค่าสิทธิ์ที่ร้องขอ mkdir -p -m เสียในลักษณะเดียวกัน
ชื่อที่แสดง

@DisplayName: ซึ่งยังคงตั้งค่าการอนุญาตที่ถูกต้องthreeโดยที่สิทธิ์เริ่มต้นเพียงพอสำหรับเส้นทางไปยังมัน
Markus W Mahlberg

17

เมื่อมีไดเร็กทอรีอยู่แล้ว:

mkdir -m 777 /path/to/your/dir

เมื่อไม่มีไดเร็กทอรีและคุณต้องการสร้างไดเร็กทอรีพาเรนต์:

mkdir -m 777 -p /parent/dirs/to/create/your/dir

สิ่งนี้จะให้สิทธิ์ 777 แก่ไดเร็กทอรีย่อยสุดท้ายเท่านั้น ฉันจะทำสิ่งนี้ได้อย่างไรและให้สิทธิ์ 777 กับไดเร็กทอรีหลักทั้งหมดด้วย?
Levi Johansen

2
ฉันไม่มีคำตอบสำหรับสิ่งนี้ แต่ฉันเชื่อว่าคำตอบอยู่ที่นี่: stackoverflow.com/questions/3740152/…
Pedro Trujillo

โปรดทราบว่าคำสั่งนี้ใช้เพื่อแก้ปัญหา "วิธีสร้างไดเร็กทอรีและให้สิทธิ์ในคำสั่งเดียว" ฉันเชื่อว่าคำตอบสำหรับคำถามของคุณจะเป็นดังนี้find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo

10

IMO ควรใช้installคำสั่งในสถานการณ์เช่นนี้ ฉันพยายามทำให้systemd-journaldการรีบูตเป็นไปอย่างต่อเนื่อง

install -d  -g systemd-journal -m 2755 -v /var/log/journal

7

คุณสามารถเขียนเชลล์สคริปต์ง่ายๆตัวอย่างเช่น:

#!/bin/bash
mkdir "$1"
chmod 777 "$1"

เมื่อบันทึกแล้วและเปิดใช้งานแฟล็กที่เรียกใช้งานได้คุณสามารถเรียกใช้แทน mkdir และ chmod:

./scriptname path/foldername

อย่างไรก็ตามคำตอบของ alexนั้นดีกว่ามากเพราะมันเกิดกระบวนการเดียวแทนที่จะเป็นสาม ฉันไม่ทราบเกี่ยวกับ-mตัวเลือกนี้


ขอบคุณ delan .. ฉันยังเขียนคำสั่งนั้นในเชลล์สคริปต์ .. แต่ฉันต้องการทำในคำสั่งเดียว
poorani

7

เพียงเพื่อขยายและปรับปรุงคำตอบข้างต้นบางส่วน:

ก่อนอื่นฉันจะตรวจสอบหน้า mkdir man สำหรับ GNU Coreutils 8.26 ซึ่งจะให้ข้อมูลเกี่ยวกับตัวเลือก '-m' และ '-p' (สามารถกำหนดเป็น --mode = MODE และ --parents ได้ตามลำดับ ):

... ตั้งค่าโหมดไฟล์ [s] (เช่นเดียวกับใน chmod) ไม่ใช่ a = rwx - umask

... ไม่มีข้อผิดพลาดหากมีอยู่ให้สร้างไดเรกทอรีหลักตามต้องการ

ข้อความนั้นคลุมเครือและไม่ชัดเจนในความคิดของฉัน แต่โดยพื้นฐานแล้วมันบอกว่าคุณสามารถสร้างไดเร็กทอรีด้วยสิทธิ์ที่ระบุโดย "chmod numeric notation" (ฐานแปด) หรือคุณสามารถไป "ทางอื่น" และใช้ a / your umask

หมายเหตุด้านข้าง: ฉันพูดว่า "อีกทางหนึ่ง" เนื่องจากค่า umask เป็นสิ่งที่ดูเหมือน - หน้ากากซ่อน / ลบสิทธิ์แทนที่จะ "ให้" เช่นเดียวกับสัญกรณ์เลขฐานแปดของ chmod

คุณสามารถรันคำสั่ง shell-builtin umaskเพื่อดูว่า umask 3 หลักของคุณคืออะไร 022สำหรับฉันมันเป็น ซึ่งหมายความว่าเมื่อฉันดำเนินการmkdir yodirectoryในโฟลเดอร์ที่กำหนด (พูดว่า mahome) และstatมันฉันจะได้ผลลัพธ์ที่คล้ายกับสิ่งนี้:

               755                   richard:richard         /mahome/yodirectory
 #          permissions                 user:group      what I just made (yodirectory),
 # (owner,group,others--in that order)                 where I made it (i.e. in mahome)
 # 

ตอนนี้เพื่อเพิ่มอีกเล็กน้อยเกี่ยวกับสิทธิ์ฐานแปดเหล่านั้น เมื่อคุณสร้างไดเร็กทอรี "ระบบของคุณ" จะใช้ค่า perms ของไดเร็กทอรีเริ่มต้นของคุณ [ซึ่งใช้กับไดเร็กทอรีใหม่ (ค่าควร 777)] และตบที่ yo (u) มาสก์ซึ่งจะซ่อนบางส่วนของ perms ได้อย่างมีประสิทธิภาพ umask ของฉันคือ 022 - ตอนนี้ถ้าเรา "ลบ" 022 จาก 777 (การลบในทางเทคนิคเป็นการเพิ่มความซับซ้อนและไม่ถูกต้องเสมอไป - เรากำลังปิด perms หรือmask ing) ... เราจะได้ 755 ตามที่ระบุไว้ (หรือ "statted" ) ก่อนหน้านี้

เราสามารถละ '0' ไว้หน้าฐานแปด 3 หลักได้ (ดังนั้นพวกมันจึงไม่จำเป็นต้องเป็น 4 หลัก) เนื่องจากในกรณีของเราเราไม่ต้องการ (หรือไม่ได้กล่าวถึง) เหนียวบิตตัวกำหนดหรือ setgids ใด ๆ (คุณอาจต้องการตรวจสอบสิ่งเหล่านั้น btw พวกเขาอาจมีประโยชน์เนื่องจากคุณกำลังจะไป 777) กล่าวอีกนัยหนึ่ง 0777 แสดงนัย (หรือเทียบเท่ากับ) 777 (แต่ 777 ไม่จำเป็นต้องเทียบเท่ากับ 0777 เนื่องจาก 777 ระบุเฉพาะสิทธิ์เท่านั้นไม่ใช่ setuids setgids ฯลฯ )

ตอนนี้เพื่อนำสิ่งนี้ไปใช้กับคำถามของคุณในแง่ที่กว้างขึ้น - คุณมี (แล้ว) มีตัวเลือกไม่กี่ตัว คำตอบทั้งหมดข้างต้นใช้ได้ผล (อย่างน้อยก็เป็นไปตามหลักของฉัน) แต่คุณอาจ (หรือมีแนวโน้มที่จะ) ประสบปัญหากับวิธีแก้ไขปัญหาข้างต้นเมื่อคุณต้องการสร้างไดเรกทอรีย่อย (ไดเรกทอรีที่ซ้อนกัน) ที่มีสิทธิ์ 777 ทั้งหมดพร้อมกัน โดยเฉพาะอย่างยิ่งถ้าฉันทำสิ่งต่อไปนี้ใน mahome ด้วย umask ของ 022:

mkdir -m 777 -p yodirectory/yostuff/mastuffinyostuff
# OR (you can swap 777 for 0777 if you so desire, outcome will be the same)
install -d -m 777 -p yodirectory/yostuff/mastuffinyostuff

ฉันจะได้รับ perms 755สำหรับทั้งสองyodirectoryและyostuffมีเพียง777perms mastuffinyostuffสำหรับ ดังนั้นดูเหมือนว่านั่นumaskคือทั้งหมดที่ตบyodirectoryและyostuff... เพื่อหลีกเลี่ยงสิ่งนี้เราสามารถใช้ subshell:

( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )

และนั่นแหล่ะ 777 perms สำหรับ yostuff, mastuffinyostuff และ yodirectory


7

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างไดเร็กทอรีและให้สิทธิ์ในเวลาเดียวกัน

mkdir -m777 path/foldername 

1
ไม่มีช่องว่างระหว่าง -m ถึง 777
Omer Gafar

1

อย่าทำ: mkdir -m 777 -p a/b/cเนื่องจากจะตั้งค่าการอนุญาตเท่านั้น777ในไดเรกทอรีสุดท้ายเท่านั้น c; a และ b จะถูกสร้างขึ้นโดยได้รับอนุญาตเริ่มต้นจาก umask ของคุณ

แทนที่จะสร้างไดเร็กทอรีใหม่โดยได้รับอนุญาต777ให้รันmkdir -pใน subshell ที่คุณแทนที่ umask:

(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)

โปรดทราบว่าสิ่งนี้จะไม่เปลี่ยนแปลงสิทธิ์หากมี a, b และ c อยู่แล้ว


ใช่ถ้าคุณส่ง umask 4 หลักเลขนำหน้าจะต้องเป็นศูนย์เสมอ (แม้ว่าคุณจะเว้นก็ได้) อาจเป็นเพราะสมมาตรกับ chmod โดยที่เลขฐานแปดตัวแรกจะตั้งค่าบิต setuid, setgid และ sticky แต่ถ้าเป็นเช่นนั้นก็ค่อนข้างไม่มีจุดหมายเนื่องจาก umask ไม่อนุญาตให้คุณ จำกัด สิ่งเหล่านั้น
John Mellor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.