Làm thế nào để loại bỏ bit thực thi đệ quy khỏi tệp (không phải thư mục)


73

Khi tôi cắm một thanh USB (FAT) vào máy Mac hoặc Ubuntu của tôi, tất cả các tệp đều có các bit thực thi được đặt. Sau khi đã sao chép cấu trúc thư mục vào đĩa cứng của mình, làm cách nào để loại bỏ các bit thực thi theo cách đệ quy khỏi các tệp và giữ chúng trên các thư mục?


Câu trả lời:


132

Với GNU chmod(trên Ubuntu) biến thể lệnh đơn (bắt đầu trong thư mục hiện tại):

chmod -R -x+X .

Giải trình:

  • -R - hoạt động đệ quy
  • -x - xóa cờ thực thi cho tất cả người dùng
  • +X - đặt cờ thực thi cho tất cả người dùng nếu đó là thư mục

Trong trường hợp này, vốn Xchỉ áp dụng cho các thư mục vì tất cả các cờ thực thi đã bị xóa bởi -x. Mặt khác, cũng +Xđặt (các) cờ thực thi nếu cờ ban đầu được đặt cho bất kỳ người dùng, nhóm hoặc người nào khác.

Với BSD chmod(hiện diện trên Mac OS X), bạn phải thực hiện riêng rẽ theo hai lệnh:

sudo chmod -R -x * && sudo chmod -R +X *

(Nếu bạn cũng muốn bao gồm các tệp ẩn trong thư mục chính, bạn có thể cần phải thay đổi * thành. (Điểm), nhưng chưa được kiểm tra.)


Trên Ubuntu 13.04, một tinh chỉnh nhỏ là cần thiết:chmod -R a-x+X *
Eero Aaltonen

@EeroAaltonen: Cảm ơn bạn đã lưu ý. Điều này có thể xảy ra nếu bạn umaskkhông cho xphép tất cả. Bạn có sử dụng mặc định umaskhoặc bạn đã thay đổi nó? Bạn có thể vui lòng gửi đầu ra của umasklệnh? Bên cạnh giải pháp của bạn cũng có khả năng này: chmod -R a-x,+X *sẽ thiết lập sự xcho phép theo của bạn umask. Tôi sẽ cập nhật câu trả lời nhưng tôi muốn kiểm tra hành vi trong BSD / Mac OS X trước.
pabouk

@pabouk oopsie! Đó thực sự là hộp CentOs nơi tôi đã đặt ô của mình thành 0007.
Eero Aaltonen

Điều này thật đáng buồn ... :( Tôi thích findbiến thể trong câu trả lời dưới đây vì phong cách kết hợp các công cụ đơn giản thực hiện One Thing Well.
mikezter

2
Sử dụng .thay vì *nếu bạn muốn áp dụng điều này cho tất cả các tệp
John Magnolia

46

Nếu bạn cd vào đúng đường dẫn trước:

find . -type f -exec chmod -x {} \;

hoặc là

chmod -x $(find . -type f)

Tìm thấy tìm thấy tất cả các tệp loại 'f' (có nghĩa là tệp thông thường) trong đường dẫn. và sau đó gọi chmod -x trên mỗi tệp. {} Được thay thế cho tên tệp và \; chấm dứt lệnh chmod.


6
Nếu bạn findhỗ trợ nó, hãy sử dụng -exec ... \+thay vì -exec ... \;- nó sẽ yêu cầu ít fork+ execs hơn. Nếu không, sử dụng find ... -print0 | xargs -0 ....
ephemient

5
Tôi đã sử dụng kỹ thuật này, nhưng với "-perm +111" được thêm vào công cụ tìm kiếm, vì vậy nó chỉ sử dụng các chmod có tập x-bit:find . -type f -perm +111 -exec chmod -x {} \;
chrish

4
+1 @Matthijs Lý do tại sao điều này tốt hơn giải pháp của pabouk là lệnh này để các thư mục một mình, trong khi pabouk đặt lại bit thực thi trong tất cả các thư mục. Có thể có một số thư mục có bit thực thi không được đặt và lệnh của pabouk đặt nó, trong khi người ta có thể muốn để chúng như vậy.
MariusMatutiae

cách tiếp cận thứ 2 sẽ thất bại đối với các đường dẫn chứa khoảng trắng.
MestreLion

@ephemient: nếu findhỗ trợ của bạn, -print0tôi khá chắc chắn rằng nó cũng sẽ hỗ trợ-exec
MestreLion

3

Trong Linux và Unix trong cửa sổ terminal hoặc On Mac OS X, hãy sử dụng cái này trong Terminal.app:

find . -type f -print0 | xargs -0 chmod -x

1
Về bản chất, điều này không khác với câu trả lời của Matthijs P từ năm 2011
slhck

Bạn có thể nhớ dòng lệnh này? Tôi không thể.
Mike L.

Xem bình luận của phù du bên dưới câu trả lời của Matthijs để xem tại sao câu trả lời này hữu ích.
PatrickT

2

Các chmod -x+Xcách không làm việc cho tôi trên ubuntu một trong hai, do đó tôi đã viết kịch bản python tối thiểu này:

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

Nếu có thể có bất kỳ nội dung bổ sung ưa thích nào như ổ cắm trong hệ thống tệp của bạn, bạn có thể muốn bao quanh chmod cuối cùng bằng một lần thử / bắt.

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.