2009-05-13 33 views
7

Tôi có thư mục src/chứa nhiều tệp .cc và tệp nhị phân của tệp. Ví dụ:Cách xóa/xóa tệp thi hành (còn gọi là tệp không có phần mở rộng) chỉ

src/ 
    |_ foo.cc 
    |_ bar.cc 
    |_ qux.cc 
    |_ thehead.hh 
    |_ foo (executable/binary) 
    |_ bar (executable/binary) 
    |_ qux (executable/binary) 
    |_ makefile 

Thực tế có rất nhiều tệp .cc và tệp thực thi.

Tôi cần xóa các tệp nhị phân đó một cách toàn cầu mà không cần phải liệt kê tất cả các tệp là . Có một cách nhanh chóng và nhỏ gọn để làm điều đó?

tôi đã cố gắng:

$ rm * 

nhưng nó loại bỏ tất cả các file bao gồm .cc và các tập tin .hh.

tôi biết lệnh này:

$ rm foo bar qux .... 

nhưng sau đó chúng tôi vẫn phải liệt kê tất cả các tập tin một.

Trả lời

16

bạn có thể chạy

find . -perm +100 -type f -delete 
+3

Chỉ để rõ ràng, điều này chỉ kiểm tra xem bit của người dùng có được đặt hay không và sử dụng cú pháp không dùng nữa. Xem người đàn ông tìm kiếm các chi tiết đẫm máu. –

16

Ở đây bạn đi:

ls | grep -v "\." | xargs rm 

Các grep -v nói "chỉ cho phép tên tập tin mà không chứa một dấu chấm", và xargs rm nói "sau đó vượt qua danh sách các tên tập tin để rm".

+4

@Richie: cảm ơn. Có cách nào để loại trừ "makefile"? Mà chúng tôi muốn giữ. – neversaint

+3

@foolishbrat: Chỉ cần thêm grep khác: ls | grep -v "\." | grep -v makefile | xargs rm – RichieHindle

+0

cách loại trừ các thư mục con? đoán bạn cần phải sử dụng 'tìm' thay vì' ls' cho điều đó? bạn cũng có thể loại trừ các tệp bằng '.' và' Makefile' bằng một 'grep' như sau:' ls | grep -v "\. \ | Makefile" ' – sixty4bit

8

Sử dụng find. Những gì bạn muốn điều này là:

find . -type f -executable -exec rm '{}' \; 

Loại bỏ tất cả mọi thứ mà không cần một phần mở rộng cũng có thể được thực hiện:

Tùy chọn cựu không xóa Makefile, và vì thế được ưa thích. Tôi nghĩ kcwu's answer cho thấy một cách tốt đẹp để cải thiện trên bằng cách sử dụng tùy chọn -delete:

find . -type f -executable -delete 
find . -type f -not -iname "*.*" -delete 

Sửa: Tôi sử dụng GNU findutils find, phiên bản 4.4.0, dưới Ubuntu 8.10. Tôi không biết rằng công tắc -executable quá phổ biến.

+0

@Stephan: Tôi nhận được "tìm: có thể thực hiện: tùy chọn không xác định" – neversaint

+0

Bạn đang sử dụng tìm kiếm nào? có thể thực hiện được với tôi. Tuy nhiên, tôi có thể sử dụng -perm/ugo + x với GNU tìm. –

+0

@foolishbrat: có lẽ bạn đang sử dụng tùy chọn cũ hơn. Hãy thử câu trả lời của kcwu. – Stephan202

2

Thay vì đi qua -exec rm '{}' \; để tìm một người có thể sử dụng -delete arg.

2

Sử dụng tìm để loại bỏ tất cả các file (không phải thư mục) mà không chứa một dấu chấm characeter:

find . \! -name "*.*" -type f -exec rm {} \; 
+0

vắng mặt. không có nghĩa là nó có thể thực hiện được –

3
find . -perm /ugo+x -delete 

phiên bản Corrected của lệnh đầu tiên Stephan202 của.

EDIT: Cũng thử:

find . -perm /111 -delete 

trong đó sử dụng bát phân tương đương

+0

@Matt: dưới MacOsX, tôi nhận được điều này: tìm: -perm:/ugo + x: chuỗi chế độ bất hợp pháp – neversaint

+0

Thử phiên bản bát phân. –

2

tôi đề nghị sử dụng đầu tiên

find . -not -name "*.*" -exec ls -l {} \; 

để xem tên của tập tin được xuất hiện.

và sau đó, thay đổi ls -l để rm

find . -not -name "*.*" -exec rm {} \; 

cũng có, bạn có thể sử dụng một dấu nhắc xác nhận để làm cho nó an toàn hơn:

find . -not -name "*.*" -exec rm -i {} \; 
5

Tôi thà đi cho một sạch mục tiêu trong Makefile. Hầu hết có lẽ nó đã chứa danh sách các tệp nhị phân này, vì vậy, hãy thêm mục tiêu sạch sẽ sẽ không yêu cầu nhiều nỗ lực.

+0

Và nó an toàn hơn. Chỉ cần suy nghĩ về những gì sẽ xảy ra nếu bạn sử dụng một trong những giải pháp grep'ish khác và ai đó quyết định rằng nó sẽ là một ý tưởng tốt để có một tập tin "README" ;-) – lothar

+1

Làm thế nào bạn sẽ viết mục tiêu 'làm sạch' để loại bỏ tất cả các tập tin thực thi được biên dịch? Tôi nghĩ đó là điểm của 'find' và' ls | grep' gõ câu trả lời, để đặt dưới 'sạch:' và bắt tất cả các thực thi? Hay tôi đang thiếu một điểm nào đó? – Harry

+0

Makefiles được làm bằng các hướng dẫn tĩnh mô tả một bản đồ mà nguồn tập tin được sử dụng để tạo ra một tập tin mục tiêu cụ thể và làm thế nào. Do đó, bạn thường có danh sách tất cả các tệp thi hành đích có thể có trong một biến có tên TARGETS hoặc tương tự. – raimue

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