2010-01-14 13 views
10

Làm thế nào để bạn loại bỏ một thư mục khi thực hiện các hoạt động tập tin tức cp, vvLàm thế nào để loại bỏ một thư mục khi thực hiện các hoạt động tập tin tức cp, mv, rm và chown vv trong Linux

tôi sẽ hiện đang sử dụng thẻ hoang dã * để áp dụng thao tác tệp cho tất cả, nhưng tôi cần loại trừ một thư mục duy nhất.

Lệnh tôi thực sự muốn sử dụng là chown để thay đổi chủ sở hữu của tất cả các tệp trong một thư mục nhưng tôi cần loại trừ một thư mục con.

+1

Được đăng tại đây: http://serverfault.com/questions/102729/how-do-i-exclude-a-folder-when-performing-file-operations-ie-cp-mv-rm -and-cho –

+0

Tôi ban đầu được đăng trên đây nhưng sau đó không chắc chắn tôi đã làm như vậy trên trang web chính xác vì vậy tôi reposted chỉ để chắc chắn. – Camsoft

Trả lời

17

Nếu bạn đang sử dụng bash và cho phép extglob qua shopt -s extglob sau đó bạn có thể sử dụng !(<pattern>) để loại trừ cho mẫu.

+2

Tôi đã thực thi lệnh trên. Bạn có thể cho tôi một ví dụ sử dụng cú pháp!() Kết hợp với chown? – Camsoft

+4

'chown 0755 -R! (Foo)' –

+0

Điều đó đã hiệu quả! Còn một câu hỏi nữa thì tên tệp bị loại trừ sẽ được áp dụng một cách đệ quy, sao cho nếu có một thư mục hoặc tệp được gọi là foo sâu hơn trong cây thư mục thì cũng sẽ bị bỏ qua? Tôi chỉ muốn loại trừ foo đầu tiên là hậu duệ trực tiếp của thư mục cấp cao nhất. – Camsoft

5
for file in *; do 
    if [ $file != "file_I_dont_want_to_chown" ] 
    then 
     chown -R Camsoft $file 
    fi 
done 
+1

Bạn không cần 'ls'. Chỉ cần sử dụng 'cho tập tin trong *' –

+1

Cảm ơn, thực hiện thay đổi – danben

+1

Ít nhất là để bash một sh ​​bạn sẽ cần một 'do' để bắt đầu vòng lặp logic. – user569825

2

Kết hợp nhiều công cụ sắc nét nhỏ của unix: Để loại trừ thư mục "foo"

% ls -d * | grep -v foo | xargs -d "\n" chown -R Camsoft 
+0

Điều đó có hoạt động đệ quy, khoan sâu vào các thư mục con không? – Camsoft

+0

Các '-0' ở đây hoàn thành không có gì. –

+0

Nó sẽ làm việc đệ quy bây giờ mà tôi đã thêm "-R". –

0

Một tùy chọn khác có thể là tạm thời xóa quyền trên tệp/thư mục đó.
Trong Unix, bạn cần quyền 'x' trên một thư mục để nhập nó.

chỉnh sửa: rõ ràng điều này không hiệu quả nếu bạn đang sao lưu cơ sở dữ liệu sản xuất trực tiếp - nhưng để loại trừ bộ sưu tập hình ảnh thú vị của bạn khi sao chép tài liệu sang USB.

+0

Thật không may là thư mục tôi muốn loại trừ là thư mục certs và làm rối các quyền này sẽ phá vỡ các yêu cầu HTTPS của chúng tôi. – Camsoft

+0

Đủ công bằng - đôi khi giải pháp đơn giản hơn câu lệnh regex/xargs phức tạp ;-) –

6
find dir_to_start -name dir_to_exclude -prune -o -print0 | xargs -0 chown owner 

find dir_to_start -not -name "file_to_exclude" -print0 | xargs -0 chown owner 
+0

+1 Tôi thích phương pháp thông thường này. –

1

Trong trường hợp này, tôi khuyên bạn nên sử dụng tìm. Bạn có thể chỉ định đường dẫn để loại trừ bằng cách sử dụng -not -iwhilename 'PATH'. Sau đó, sử dụng lệnh exec bạn thực hiện lệnh bạn muốn thực hiện

find . -not -iwholename './var/foo*' -exec chown www-data '{}' \; 

Mặc dù điều này có thể giúp bạn trong trường hợp này, tôi cũng thấy tập lệnh đặt cờ không thay đổi. Hãy chắc chắn rằng bạn loại bỏ cờ khi bạn làm xong bạn nên sử dụng bẫy cho điều này chỉ trong trường hợp kịch bản bị giết sớm (lưu ý: chạy từ một kịch bản, mã bẫy chạy khi phiên bash thoát). Rất nhiều rắc rối trong lựa chọn của tôi nhưng nó tốt trong một số tình huống.

cd /var 
trap 'chattr -R -i foo > /dev/null 2>&1' 0 
chattr -R +i foo 
chown -R www-data * 
Các vấn đề liên quan