Câu trả lời:
Đây là những gì bạn đang tìm kiếm:
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
Điều này sử dụng findchứ không phải lsvì, nói chung, phân tích cú pháp lsđầu ra là không đáng tin cậy . Biểu mẫu này find, tuy nhiên, sẽ hoạt động với tên tệp ngay cả khi chúng có dòng mới hoặc các ký tự khó khác.
Giải trình
find . -maxdepth 1 -type f -print0
Điều này chọn các tập tin. Điều này có thể được tùy chỉnh bằng cách sử dụng bất kỳ tùy chọn nào của find. Tùy chọn print0yêu findcầu in tên tệp trong danh sách được phân tách bằng null. Đây là đáng tin cậy duy nhất để truyền danh sách tên tập tin.
xargs -L1 -p0 chmod +x
Cái này lấy danh sách tên tệp được phân tách bằng null findvà được áp dụng lệnh của bạn cho chúng.
Các -L1tùy chọn cho xargscông việc trên chỉ có một tên tập tin tại một thời điểm. Các -ptùy chọn kể xargsđể nhắc nhở chính trước khi tiếp tục. Các -0tùy chọn cho xargssử dụng các ký tự null là dấu phân cách giữa tên tập tin.
[Tôi không biết về -ptùy chọn này cho xargsđến khi @kwan chỉ ra.]
find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.Vì vậy, nó hoạt động với -maxdepth 1trước -type f, như : find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Bạn có thể sử dụng xargs.
ví dụ:
ls|xargs -I path -p chmod +x path
Tùy chọn -p: Nhắc người dùng về việc có nên chạy từng dòng lệnh và đọc một dòng từ thiết bị đầu cuối hay không. Chỉ chạy dòng lệnh nếu phản hồi bắt đầu bằng 'y' hoặc 'Y'.
xargs -pnhiều đến mức tôi sẽ sao chép nó.
touch "a very long file namevà nhấn enter. Xem phần tiếp tục dòng và chỉ cần gõ dấu ngoặc kép và nhấn enter lần nữa. tadaa, dòng mới trong tên tệp. Thoát khỏi sự lười biếng để gõ lại một tên tệp dài.
findlệnh POSIX tương thích bằng cách sử dụng-exec printf '%s\0' {} +. Đừng nghĩ rằng có bất kỳ cách nào để làm cho toàn bộ điều tương thích POSIX.