Cách tạo thư mục và cấp quyền chỉ trong một lệnh


107

Làm thế nào để tạo một thư mục và cấp quyền trong một lệnh trong Linux?

Tôi phải tạo rất nhiều thư mục với đầy đủ quyền 777.

Lệnh

mkdir path/foldername
chmod 777 path/foldername 

Tôi không thích tạo và cấp quyền trong hai lệnh. Tôi có thể làm điều này trong một lệnh không?


1
mkdir temp; chmod 777 templà một dòng. Bạn có thể đặt 'temp' một biến và lưu nó dưới dạng lệnh bash. Đây có phải là những gì bạn đang muốn làm?
styfle

1
chào @ white-rose, vui lòng xem câu trả lời mới nhất, nó phải là câu trả lời được chấp nhận. phần thưởng, nó kết hợp mkdir, chmod VÀ chown trong một viên đạn duy nhất!
Costin Gușă

Câu trả lời:


205

Theo trang người đàn ông của mkdir ...

mkdir -m 777 dirname

1
Bạn có thể cho tôi biết về tùy chọn -m không?
poorani

Tùy chọn @Whiterose -m dành cho Chế độ. Đặt các bit quyền cho các thư mục mới tạo thành giá trị được chỉ định bởi biến Chế độ. Biến Mode nhận các giá trị giống như tham số Mode cho lệnh chmod, ở dạng tượng trưng hoặc số.
TMKasun

14
mkdir -p -m bị hỏng, vì chế độ này chỉ được áp dụng cho thư mục cuối cùng trong đường dẫn bạn nhập. Ví dụ: mkdir -p -m 707 một / hai / ba. Ngay cả khi cả ba thư mục đều mới được tạo, chỉ thư mục cuối cùng mới có quyền được yêu cầu và các thư mục khác, mặc định. cài đặt -d -m bị hỏng theo cùng một cách.
Tên hiển thị

Ngoài vấn đề xung quanh -p@DisplayName đã được đề cập ở trên, còn có một vấn đề khác. Các -msẽ chỉ áp dụng nếu một thư mục được thực sự tạo ra. Nếu nó đã tồn tại, chế độ của nó sẽ không bị thay đổi. Tùy thuộc vào bối cảnh của bạn, điều này có thể tốt hoặc xấu.
Adam Badura,

1
thư mục mkdir -m777
Hugo Deiró

19
install -d -m 0777 /your/dir

sẽ cung cấp cho bạn những gì bạn muốn. Cần biết rằng mọi người dùng đều có quyền ghi thêm và xóa tệp trong thư mục đó.


1
tiền thưởng, bạn cũng có thể thêm -g và / hoặc -o và bạn có thể có mkdir, chmod và chown trong một lần bắn!
Costin Gușă

4
Nó bị hỏng. cài đặt -d -m 070 một / hai / ba. Ngay cả khi tất cả ba thư mục trong đường dẫn đều được tạo mới, chỉ thư mục cuối cùng mới có các quyền được yêu cầu. mkdir -p -m bị hỏng theo cách tương tự.
Tên hiển thị

@DisplayName: tuy nhiên đặt các quyền chính xác three, với các quyền mặc định là đủ cho đường dẫn đến nó.
Markus W Mahlberg

16

Khi thư mục đã tồn tại:

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

Khi thư mục không tồn tại và bạn muốn tạo các thư mục mẹ:

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

Điều này sẽ chỉ cấp quyền 777 cho thư mục con cuối cùng. Làm cách nào tôi có thể thực hiện việc này và cấp quyền 777 cho tất cả các thư mục mẹ?
Levi Johansen

1
Tôi không có một câu trả lời cho điều này nhưng tôi tin rằng câu trả lời cho điều này là ở đây: stackoverflow.com/questions/3740152/...
Pedro Trujillo

Lưu ý rằng lệnh này là để giải quyết vấn đề này "Cách tạo thư mục và cấp quyền trong lệnh đơn". Tôi tin rằng giải pháp cho vấn đề của bạn sẽ được một cái gì đó như:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo

10

IMO, tốt hơn là sử dụng installlệnh trong những tình huống như vậy. Tôi đã cố gắng tạo systemd-journaldliên tục qua các lần khởi động lại.

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

7

Bạn có thể viết một kịch bản shell đơn giản, ví dụ:

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

Sau khi được lưu và cờ thực thi được bật, bạn có thể chạy nó thay vì mkdir và chmod:

./scriptname path/foldername

Tuy nhiên, câu trả lời của alex tốt hơn nhiều vì nó sinh ra một quy trình thay vì ba. Tôi không biết về -mtùy chọn này.


Cảm ơn delan .. Tôi cũng đã viết lệnh đó trong kịch bản shell .. Nhưng tôi muốn thực hiện trong một lệnh duy nhất.
poorani

7

Chỉ để mở rộng và cải thiện một số câu trả lời ở trên:

Đầu tiên, tôi sẽ kiểm tra trang mkdir man cho GNU Coreutils 8.26 - nó cung cấp cho chúng tôi thông tin này về tùy chọn '-m' và '-p' (cũng có thể được cung cấp dưới dạng --mode = MODE và - parent, tương ứng ):

... đặt [s] chế độ tệp (như trong chmod), không phải a = rwx - umask

... không có lỗi nếu hiện có, hãy tạo thư mục mẹ nếu cần

Theo quan điểm của tôi, các tuyên bố là mơ hồ và không rõ ràng. Nhưng về cơ bản, nó nói rằng bạn có thể tạo thư mục với các quyền được chỉ định bởi "ký hiệu số chmod" (số bát phân) hoặc bạn có thể đi "theo cách khác" và sử dụng a / umask của bạn.

Lưu ý phụ: Tôi nói "theo cách khác" vì giá trị umask thực sự giống như âm thanh của nó - một mặt nạ , ẩn / xóa các quyền chứ không phải "cấp" chúng như với ký hiệu bát phân số của chmod.

Bạn có thể thực hiện lệnh shell-nội trang umaskđể xem umask 3 chữ số của bạn là gì; đối với tôi, nó 022. Điều này có nghĩa là khi tôi thực thi mkdir yodirectorytrong một thư mục nhất định (giả sử, mahome) và statnó, tôi sẽ nhận được một số đầu ra giống như sau:

               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)
 # 

Bây giờ, chỉ cần thêm một chút nữa về các quyền bát phân đó. Khi bạn tạo một thư mục, "hệ thống của bạn" lấy perms thư mục mặc định của bạn '[áp dụng cho các thư mục mới (giá trị của nó phải là 777)] và đóng vào mặt nạ yo (u), ẩn một số perms' một cách hiệu quả. Umask của tôi là 022 - bây giờ nếu chúng tôi "trừ" 022 khỏi 777 (phép trừ về mặt kỹ thuật là một phép nhân quá mức và không phải lúc nào cũng chính xác - chúng tôi thực sự đang tắt perms hoặc mask trong chúng) ... chúng tôi nhận được 755 như đã nêu (hoặc "statted" ) sớm hơn.

Chúng tôi có thể bỏ qua số '0' trước các bát phân có 3 chữ số (vì vậy chúng không phải là 4 chữ số) vì trong trường hợp của chúng tôi, chúng tôi không muốn (hoặc đúng hơn là không đề cập đến) bất kỳ chất dính, setuids hoặc setgids nào (bạn có thể muốn xem xét những thứ đó, btw, chúng có thể hữu ích vì bạn đang sử dụng 777). Vì vậy, nói cách khác, 0777 ngụ ý (hoặc tương đương với) 777 (nhưng 777 không nhất thiết phải tương đương với 0777 - vì 777 chỉ xác định các quyền, không phải setuids, setgids, v.v.)

Bây giờ, để áp dụng điều này cho câu hỏi của bạn theo nghĩa rộng hơn - bạn đã (đã) có một vài lựa chọn. Tất cả các câu trả lời ở trên đều hoạt động (ít nhất là theo coreutils của tôi). Nhưng bạn có thể (hoặc rất có khả năng) gặp sự cố với các giải pháp trên khi bạn muốn tạo các thư mục con (thư mục lồng nhau) với 777 quyền cùng một lúc. Cụ thể, nếu tôi làm như sau trong mahome với umask là 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

Tôi sẽ nhận được perms 755cho cả hai yodirectoryyostuff, chỉ với 777perms cho mastuffinyostuff. Vì vậy, có vẻ như umasklà tất cả những gì đã xảy ra yodirectoryyostuff... để giải quyết vấn đề này, chúng ta có thể sử dụng một vỏ con:

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

và đó là nó. 777 perms cho yostuff, mastuffinyostuff và yodirectory.


7

bạn có thể sử dụng lệnh sau để tạo thư mục và cấp quyền cùng một lúc

mkdir -m777 path/foldername 

1
không có khoảng trống giữa -m và 777
Omer Gafar

1

Đừng làm: mkdir -m 777 -p a/b/c vì điều đó sẽ chỉ thiết lập quyền 777trên thư mục cuối cùng, c; a và b sẽ được tạo với quyền mặc định từ umask của bạn.

Thay vào đó, để tạo bất kỳ thư mục mới nào có quyền 777, hãy chạy mkdir -ptrong một vỏ con nơi bạn ghi đè umask:

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

Lưu ý rằng điều này sẽ không thay đổi quyền nếu bất kỳ a, b và c nào đã tồn tại.


Vâng, nếu bạn vượt qua umask 4 chữ số, chữ số hàng đầu luôn phải bằng 0 (mặc dù bạn có thể bỏ qua nó). Nó có thể là đối xứng với chmod, trong đó chữ số bát phân đầu tiên đặt các bit setuid, setgid và dính, nhưng nếu vậy thì nó khá vô nghĩa vì umask không cho phép bạn hạn chế chúng.
John Mellor
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.