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 find
chứ không phải ls
vì, 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 print0
yêu find
cầ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 find
và được áp dụng lệnh của bạn cho chúng.
Các -L1
tùy chọn cho xargs
công việc trên chỉ có một tên tập tin tại một thời điểm. Các -p
tùy chọn kể xargs
để nhắc nhở chính trước khi tiếp tục. Các -0
tùy chọn cho xargs
sử 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ề -p
tù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 1
trướ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 -p
nhiều đến mức tôi sẽ sao chép nó.
touch "a very long file name
và 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.
find
lệ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.