Có một lệnh một dòng để làm cho chmod tương tác?


24

Tôi đang tìm kiếm một cái gì đó như:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Hoặc cú pháp tương tự.

Cũng có thể làm việc trên các lệnh khác mà bạn muốn xác nhận cá nhân.

Câu trả lời:


45

Đâ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.]


Bạn có thể làm cho 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.
l0b0

Cú pháp này cho tôi một cảnh báo 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.
Harvey

@Harvey Bạn đã đúng: Tôi đã cập nhật câu trả lời để xóa cảnh báo đó.
John1024

25

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'.


1
+1 Tôi thích việc bạn sử dụng xargs -pnhiều đến mức tôi sẽ sao chép nó.
John1024

1
Hoàn hảo! Và cách rất đơn giản để thực hiện hầu hết mọi lệnh tương tác. Cảm ơn.
Harvey


@Kroltan - tại sao mọi người sẽ sử dụng một dòng mới trong tên tệp?
nbubis

1
@nbubis Nó có thể xảy ra: đi đến một thiết bị đầu cuối và gõ 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.
Kroltan
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.