2011-10-18 27 views
22

Tôi phải viết một tập lệnh tìm tất cả các tệp thi hành trong một thư mục. Vì vậy, tôi đã thử một số cách để thực hiện nó và họ thực sự làm việc. Nhưng tôi tự hỏi nếu có một cách tốt hơn để làm như vậy.Tìm tệp thi hành bằng ls và grep

Vì vậy, đây là cách tiếp cận đầu tiên của tôi:

ls -Fla | grep \*$ 

này hoạt động tốt, bởi vì lá cờ -F làm việc cho tôi và cho biết thêm cho mỗi tập tin thực thi một dấu sao, nhưng chúng ta hãy nói rằng tôi không thích dấu hoa thị.

Vì vậy, đây là cách tiếp cận thứ hai:

ls -la | grep -E ^-.{2}x 

này quá hoạt động tốt, tôi muốn có một dấu gạch ngang như ký tự đầu tiên, sau đó tôi không quan tâm đến hai nhân vật tiếp theo và ký tự thứ tư phải là x .

Nhưng có một chút mơ hồ trong các yêu cầu, bởi vì tôi không biết liệu tôi có phải kiểm tra người dùng, nhóm hoặc sự cho phép thực thi khác hay không. Vì vậy, điều này sẽ hoạt động:

ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x 

Vì vậy, tôi đang thử nghiệm ký tự thứ tư, thứ bảy và thứ mười là x.

Bây giờ câu hỏi thực sự của tôi, là có một giải pháp tốt hơn sử dụng ls và grep với regex để nói:

Tôi muốn grep chỉ những tập tin, có ít nhất một x trong mười ký tự đầu tiên của một dòng sản phẩm của ls -la

+2

Cảm ơn bạn đã thực sự tìm kiếm một số loại giải pháp trước khi yêu cầu trợ giúp. Vì bạn có yêu cầu sử dụng ls và grep, nó có vẻ như một câu hỏi về bài tập về nhà và tôi thấy mọi người yêu cầu câu trả lời cho bài tập về nhà mà không cố gắng (hoặc ít nhất là không có mô tả về những nỗ lực của họ). Tôi biết đã gần 4 năm sau, nhưng dù thế, tốt lắm. –

Trả lời

37

Bạn có cần sử dụng ls không? Bạn có thể sử dụng chức năng tìm kiếm để thực hiện tương tự:

find . -maxdepth 1 -perm -111 -type f 

sẽ trả về tất cả các tệp thi hành trong thư mục hiện tại. Hủy bỏ cờ -maxdepth để duyệt qua tất cả các thư mục con.

Bạn có thể thử tính terribleness này nhưng nó có thể phù hợp với các tệp có chứa chuỗi trông giống như quyền.

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}" 
+0

yes Tôi phải sử dụng ls và grep, nhưng cảm ơn bạn anyway – k13n

35

Nếu bắt buộc phải sử dụng ls và grep, công trình này:

ls -Fla | grep '^\S*x\S*' 

Nó phù hợp với dòng mà từ đầu tiên (không khoảng trắng) chứa ít nhất một 'x'.

Tìm là công cụ hoàn hảo cho việc này. Đây tìm thấy tất cả các file (-type f) được thực thi:

find . -type f -executable 

Nếu bạn không muốn nó đệ quy liệt kê tất cả tập tin thực thi, sử dụng maxdepth:

find . -maxdepth 1 -type f -executable 
+0

Hơn bạn cho câu trả lời của bạn và 'tìm. -type f -executable' hoạt động hoàn hảo. Nhưng như tôi đã nói trước khi tôi phải sử dụng ls và grep. Tôi chỉ tự hỏi nếu có một giải pháp cho một regex thông minh hơn – k13n

+0

Bất kỳ lý do cụ thể? looping thông qua đầu ra ls là một ý tưởng tồi. –

+0

Được rồi, tôi đã thêm một regex sẽ làm những gì bạn muốn. – rmmh

7

Có lẽ với thử nghiệm -x?

for f in $(\ls) ; do test -x $f && echo $f ; done 

\ on ls sẽ bỏ qua bí danh vỏ.

+1

AFAICS cũng liệt kê các thư mục. OP có thể tốt hơn với ... 'cho f bằng $ (\ ls); làm/usr/bin/test -x $ f -a! -d $ f && echo $ f; done' –

5
for i in `ls -l | awk '{ if ($1 ~ /x/) {print $NF}}'`; do echo `pwd`/$i; done 

Điều này cho phép đường dẫn tuyệt đối để thực thi.

-3
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}' 
+0

Câu trả lời này được bật lên trong hàng đợi đánh giá chất lượng thấp, có lẽ vì bạn không cung cấp bất kỳ lời giải thích nào về mã. Nếu mã này trả lời câu hỏi, hãy cân nhắc việc thêm một số văn bản giải thích mã trong câu trả lời của bạn. Bằng cách này, bạn có nhiều khả năng nhận được nhiều upvotes hơn - và giúp người hỏi tìm hiểu điều gì đó mới mẻ. – lmo

Các vấn đề liên quan