Sao chép quyền truy cập tệp, nhưng không phải tệp trong Unix


14

(Từ: /programming/15245144/copy-file-permissions-but-not-files , đã đóng cửa vì lạc đề)

Tôi có hai bản sao của cùng một cây thư mục. Chúng gần như có cùng một tệp trong cả hai (một phiên bản có thể có thêm một vài tệp bị thiếu). Tuy nhiên, hầu hết các tệp đều chung cho cả hai thư mục (có cùng đường dẫn tương đối và mọi thứ).

Giả sử đây là trong các thư mục:

version1/
version2/

Vấn đề là các quyền trong phiên bản 1 / đã bị rối và tôi muốn sao chép các quyền từ phiên bản 2 /, nhưng thực hiện nó mà không thay thế các tệp trong phiên bản 1 / mới hơn.

Có một cách tự động để làm điều này thông qua các lệnh shell hoặc script?


Ở đây có một kịch bản rất hữu ích trong perl mà bạn có thể sử dụng serverfault.com/questions/373058/...
nonono

Câu trả lời:


15

GNU cp biết --attributes-onlycờ từ coreutils 8.6

--attribut-only không sao chép dữ liệu tệp, chỉ các thuộc tính


1
Phiên bản của tôi dường như không có cờ đó, và một số bài viết dường như có những cảnh báo đáng sợ chẳng hạn.
shearn89

14

Phiên bản của cptôi không có --attributes-onlycờ, vì vậy tôi đã làm việc này. Thử nghiệm ngắn gọn trên các thư mục đơn giản, YMMV.

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb  5 12:49 version1/1/a

$> find version1 -type f -printf '%P\n' | xargs -I {} \
    chmod --reference=version1/{} version2/{}

$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a

5

Bạn có thể, nhưng tôi không nghĩ theo "cách tự động"!

GNU chown và GNU chmod có một --reference=RFILEtham số bạn có thể sử dụng.

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

Nó sử dụng RFILEcác cài đặt (quyền, chủ sở hữu, nhóm, v.v.) và sao chép chúng vào yourfile.

hướng dẫn giải thích chi tiết hơn.


0

Trong trường hợp của tôi, tôi đã giải quyết bằng cách sử dụng lệnh "stat" với "find" và "vi" để tạo tập lệnh áp dụng quyền.

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

Vào "vi" Tôi chèn vào tất cả các dòng lệnh "chmod": %s/^/chmod /g Tôi đã sao chép tập lệnh trong version2/thư mục và thực thi nó.

Các giải pháp khác có vẻ hợp lệ nhưng tôi không thử nghiệm chúng trong trường hợp.


0

Lấy cảm hứng từ câu trả lời của Mariano Paniga, tôi nghĩ rằng tôi có một câu hỏi hay hơn, đó là không cần phải vi và tìm kiếm / thay thế các lệnh. Tôi thậm chí còn muốn sao chép thông tin sở hữu (uid / gid).

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

Bạn có thể tùy chỉnh các lệnh bên trong stat -c '...'thành bất cứ điều gì bạn muốn. Đối với tất cả các tùy chọn có sẵn, xem man stat.


Tập lệnh của bạn có xử lý tên với các dòng mới được nhúng không?
Deer Hunter

@ Deer-hunter Nó sẽ hoạt động như bình thường, nếu không, bạn có thể thêm một trích dẫn ".." xung quanh phần tên tệp.
Tomofumi
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.