Làm thế nào để chown / chmod tất cả các tập tin trong thư mục hiện tại?


56

Tôi đang cố gắng thay đổi quyền sở hữu và quyền của một số tệp (và thư mục) trong thư mục hiện tại. Tôi đã thử điều này:

chown username:groupname .

... Hy vọng rằng nó sẽ ảnh hưởng đến tất cả các tệp trong thư mục hiện tại, nhưng thay vào đó chỉ ảnh hưởng đến thư mục mà tôi đang ở (điều này trái ngược với những gì tôi muốn làm). Tôi muốn thay đổi nó trên tất cả các tệp mà không ảnh hưởng đến thư mục hiện tại mà tôi đang ở.

Làm thế nào tôi có thể chown và chmod tất cả các tập tin trong thư mục hiện tại?


man chownman chmoddễ dàng trả lời câu hỏi của bạn.
Shi

2
@Shi tôi nghĩ đó là một câu hỏi công bằng. Đọc trang người đàn ông đó sẽ không giúp được gì. Globbing không phải là một phần của chmod. Nó được tích hợp vào vỏ. Ngoài ra, việc đọc tài liệu về Globing hút cuộc sống của bạn (Tôi đã dành nhiều thời gian để tìm ra tất cả các tính năng của zsh).
djf

1
@djf:chown -R user:group .
Shi

Câu trả lời:


96

Bạn muốn sử dụng chown username:groupname *và để shell mở rộng *nội dung của thư mục hiện tại. Điều này sẽ thay đổi quyền cho tất cả các tệp / thư mục trong thư mục hiện tại, nhưng không thay đổi nội dung của các thư mục.

Bạn cũng có thể làm chown -R username:groupname ., điều này sẽ thay đổi các quyền trên thư mục hiện tại, sau đó lặp lại bên trong nó và tất cả các thư mục con để thay đổi các quyền.

chown -R username:groupname *sẽ thay đổi các quyền trên tất cả các tệp và thư mục theo cách đệ quy, trong khi để riêng thư mục hiện tại. Phong cách này và phong cách đầu tiên là những gì tôi thấy mình sử dụng thường xuyên nhất.


2
@Andrew Hãy cảnh giác, anh ta có thể vừa là bạn vừa là kẻ thù cho sự mệt mỏi hoặc không chuẩn bị.
Darth Android

5
Ngoài ra, hãy cẩn thận với những nguy hiểm của thời kỳ. Vì nó được đặt ngay bên cạnh "/" trên bàn phím. Một lỗi đánh máy đơn giản có thể dễ dàng biến chown -R username:groupname .thành chown -R username:groupname /. Làm một nhiệm vụ 2 giây là một cơn ác mộng 2 ngày.
teynon

@Tom Đó là lý do tại sao tôi có thể nên bắt đầu sử dụng -vtrên tất cả các lệnh đệ quy của mình, nhưng quá lười biếng
Kolob Canyon

Chỉ cần nâng cấp là anwser tốt nhất và ngắn gọn nhất, mặc dù tôi sẽ nói cụ thể và đặt tên cho thư mục, chỉ để tránh trượt bàn phím:chown -R username:groupname directoryname
Dave Everitt

9

Tôi nghĩ bạn muốn điều này:

chown username:groupname *

Nếu bạn cũng muốn thay đổi đệ quy các thư mục con, bạn sẽ cần công tắc -R( -rkhông dùng nữa):

chown -R username:groupname *


0

chownlà tuyệt vời nếu bạn là một siêu người dùng. Tôi gặp vấn đề khi người khác chạy maketrong thư mục của tôi và hiện sở hữu một số tệp mà tôi không thể sửa đổi. Đây là cách giải quyết của tôi xử lý các tệp và thư mục, mặc dù nó để các thư mục nằm xung quanh với hậu tố .mkmeownernếu nó không thể xóa chúng.

  • Tập lệnh sau đây thay đổi quyền sở hữu các tệp và thư mục được người dùng hiện tại sở hữu, cố gắng khắc phục các sự cố về quyền bằng cách tạo một bản sao mới của mọi thư mục hoặc tệp không thuộc quyền sở hữu của người dùng hiện tại, xóa (hoặc cố gắng xóa) các tập tin ban đầu, và đổi tên thích hợp.
  • Mục đích của nó là viết tắt của "make me own". Tôi không sử dụng dấu gạch dưới vì chúng là một loại đau.

Ví dụ:

% mkmeowner .

% mkmeowner dirpath1 dirpath2
  • Nó đòi hỏi đoạn script sau mkmeowneronephải nằm trong đường dẫn của bạn.

chủ sở hữu

#!/bin/bash
[ "x$1" == "x-h" ] || [ "x$1" == "x--help" ] && cat << END && exit 0
Usage: $0 dirorfile [direorfile2 ...]:
    change ownership of directories or files to current user.
    Current user must have permissions to read those and write to owner directory.
END
mkmeownerone=`which mkmeownerone`
for d in $*; do
    find "$d" -not -user `whoami` -exec $mkmeownerone {} \;
done

mkmeownerone:

#!/bin/bash
# change ownership of one file or directory
f="$1"
expr match "${f}" '.*\.mkmeowner$' > /dev/null && exit 1 # already tried to do this one
if mv -f "$f" "${f}.mkmeowner"; then
    cp -pr "${f}.mkmeowner" "$f" && rm -rf "${f}.mkmeowner"
    exit 0
fi
exit 1

1
(1) Chúng tôi thích câu trả lời bao gồm một số giải thích. Tôi đã rất ngạc nhiên khi tôi đọc kịch bản của bạn và thấy những gì họ đã làm, bởi vì đoạn giới thiệu của bạn đã không cho tôi manh mối. (2) Bạn đã quên đề cập rằng người dùng phải đưa mkmeowneronevào PATH tìm kiếm.  mkmeownersẽ nổ tung nếu điều đó không được thực hiện. (3) Vui lòng tìm hiểu cách (nghĩa là khi nào và ở đâu) để sử dụng dấu ngoặc kép trong các lệnh shell và script. Nói ${f}không phải là một thay thế hữu ích; thấy này . Tiết (Cont'd)
Scott

(Tiếp theo) Nhiều (4) Nếu bạn chạy tập lệnh của mình trên một thư mục, nó sẽ có khả năng sao chép mọi tệp trong thư mục đó hai lần. (5)  exprlà cổ xưa. Sẽ hiệu quả hơn khi thực hiện khớp chuỗi đơn giản trong trình bao; bash cũng hỗ trợ kết hợp biểu thức chính quy. Đối với vấn đề đó, bạn có thể thực hiện kiểm tra tên tệp trong find. (6) expr matchLệnh của bạn kiểm tra xem ${f}kết thúc bằng mkmeowner, chứ không phải kết thúc bằng .mkmeowner. Do đó, kịch bản sẽ không tự hoạt động. Tiết (Cont'd)
Scott

(Tiếp theo) Hiện tại, có thể nói, đây là một điều tốt - bạn không muốn di chuyển và có khả năng xóa một tập lệnh trong khi nó đang chạy. (Nó không nhất thiết sẽ gây ra vấn đề, nhưng nó có thể lộn xộn.) Nhưng bạn nên hiểu (và tài liệu) các trường hợp đặc biệt như thế. (7) Bạn có thể muốn sử dụng dấu gạch dưới trong chuỗi nhiều từ.  dirorfilerất khó đọc và hiểu (so sánh với dir_or_file) và khi tôi nhìn thấy mkmeowner, suy nghĩ đầu tiên của tôi là về một con mèo ( mk +  meow +  ner).
Scott

Cảm ơn các ghi chú Scott. 1. Tôi nghĩ rằng tôi đã có một lời giải thích nhưng hãy để tôi rõ ràng hơn. 2. điểm tốt. Tôi đã nắm bắt được điều đó trong kịch bản gốc của mình, nhưng lấy ra tài liệu tham khảo. 3. Tôi đã viết kịch bản shell trong 30 năm, nhưng chắc chắn, tôi sẽ cố gắng tìm hiểu thêm. 4. Có nó. Về mục đích bởi vì nếu tôi không sở hữu thư mục, tôi không thể xóa nó. Tôi có thể đề cập đến điều đó. 5. Yah Tôi lỗi thời, nhưng expr vẫn hoạt động khá tốt 6. ha điểm tốt. 7. Tôi có thể, tôi nghĩ rằng tôi có được một số giấy phép nghệ thuật mặc dù, vì gạch dưới không phải là một quy tắc. Tôi cần một kịch bản làm cho meo meo!
sbcondor

Tôi không nghĩ có gì sai với $ {f}, phải không? Nó chỉ dài hơn một chút so với cần thiết. Đó là định dạng tôi thường sử dụng vì tôi có thể muốn sử dụng biến để tạo chuỗi dài hơn như $ {f} .mkmeowner và tôi không phải nhớ liệu $ f.heck có nghĩa là $ {f} + heck hay $ { f.heck}
sbcondor
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.