2009-03-17 34 views
12

Tôi đang cố xóa tất cả thư mục .svn khỏi thư mục làm việc.Tại sao công cụ 'tìm' của tôi không hoạt động như tôi mong đợi khi sử dụng -exec?

Tôi nghĩ tôi sẽ chỉ cần sử dụng tìm và rm như thế này:

find . -iname .svn -exec 'rm -rf {}' \; 

Nhưng kết quả là:

tìm: rm -rf ./src/.svn: Không có tập tin hoặc thư mục

như vậy

Rõ ràng là tệp tồn tại hoặc không tìm thấy nó ... Tôi đang thiếu gì?

+2

Bạn thực sự nên sử dụng -delete with find, nếu có thể. Đừng quên sử dụng -depth với tìm khi sử dụng -delete hoặc rm -rf. – ashawley

+0

Dường như -delete ngụ ý - theo thứ tự theo trang người đàn ông. –

Trả lời

23

Bạn không nên đặt rm -rf {} trong dấu nháy đơn.

Như bạn đã trích dẫn, trình bao đang xử lý tất cả các đối số cho -exec dưới dạng lệnh thay vì lệnh cộng với đối số, vì vậy, tìm kiếm tệp có tên "rm -rf ./src/.svn" và không tìm thấy.

Hãy thử:

find . -iname .svn -exec rm -rf {} \; 
+0

Đúng. Cả hai đều đúng. Tôi cũng nhận ra điều đó. –

+0

Tôi nghĩ rằng lần cuối cùng tôi sử dụng -exec nó đã cho một grep mà tôi cần phải trích dẫn regex, và vì vậy tôi đã có trong đầu của tôi. Cảm ơn tất cả! –

+0

Tôi nói "Không cần" vì nó trông giống như Sam nghĩ anh cần. Tuy nhiên, tôi thấy rằng điều này là mơ hồ và sẽ chỉnh sửa. –

1

Bạn cũng có thể sử dụng lệnh svn như sau:

svn export <url-to-repo> <dest-path> 

Look here for more info.

+0

Tuyệt vời. Tôi nghĩ rằng tôi có thể làm điều đó nhưng tôi không biết làm thế nào để xuất khẩu thư mục làm việc. Cảm ơn! –

1

Hãy thử

find . -iname .svn -exec rm -rf {} \; 

và có lẽ nên làm việc IIRC.

7

Chỉ cần tạm biệt, bạn có lẽ nên thoát khỏi thói quen sử dụng -exec cho những thứ có thể được thực hiện cho nhiều tệp cùng một lúc. Ví dụ, tôi sẽ viết rằng theo thói quen như

find . -iname .svn -print | xargs rm -rf 

hay, vì bây giờ tôi đang sử dụng một máy tính Macintosh và nhiều khả năng gặp phải tập tin hoặc thư mục tên với khoảng trống trong đó

find . -iname .svn -print0 | xargs -0 rm -rf 

"xargs "đảm bảo rằng" rm "được gọi chỉ một lần mỗi" N "tập tin, nơi" N "thường là 20. Đó không phải là một chiến thắng lớn trong trường hợp này, bởi vì rm là nhỏ, nhưng nếu chương trình bạn muốn thực thi trên mỗi tập tin lớn hoặc đã xử lý rất nhiều khi khởi động, nó có thể làm mọi thứ nhanh hơn rất nhiều.

+0

Tuyệt vời. Tôi sẽ xem trang hướng dẫn sử dụng cho xarg, và đối với bản ghi, tôi cũng đang sử dụng một mac. w00t! –

+1

Ngoài ra, bạn có thể kết thúc mệnh đề tìm kiếm bằng "\ +" thay cho "\;", tương đương với việc sử dụng -print0 và đường ống đến xargs. –

+1

@Adam, điều đó phải khá mới? Tâm trí bạn, tôi chuyển sang sử dụng args trở lại trong những ngày của Ultrix trên MicroVax, do đó, "mới" có thể có nghĩa là "trong 15-20 năm qua". –

2

có lẽ nó chỉ cho tôi, nhưng cái cũ tìm & rm kịch bản không làm việc trên cấu hình hiện tại của tôi, a la:

find/data/bin/kiểm tra -type d -mtime 10 - tên "[0-9] *" -exec rm -rf {} \;

trong khi các giải pháp xargs không, a la:

find/data/bin/kiểm tra -type d -mtime 10 -name '[0-9] *' -print | xargs rm -rf;

không biết tại sao, nhưng tôi đã cập nhật scriptLib của tôi vì vậy tôi không dành một vài giờ đánh bại đầu của tôi về một cái gì đó đơn giản như vậy ....

(chạy RHEL dưới kernel-2.6.18- 194.11.3.el5)

EDIT: phát hiện ra lý do tại sao - RHEL mặc định distro vi của tôi để chèn cr sợ hãi vào ngắt dòng (whch phá vỡ lệnh) - gợi ý từ nx5000 & jliagre tại linuxquestions.org sau, thêm sau đây để ~/.vimrc:

: set fileformat = unix

đồ < F4>: bộ fileformat = unix < CR>

đồ < F5>: set fileformat = dos < CR>

cho phép hành vi để xoay quanh F4/F5.

để kiểm tra xem CR của được nhúng trong tập tin của bạn:

đầu -1 scriptFile.sh | od -c | đầu -1

http://www.linuxquestions.org/questions/linux-general-1/bad-interpreter-no-such-file-or-directory-213617/

0

Bạn có thể vượt qua bất cứ điều gì bạn muốn trong dấu ngoặc kép, với cách lừa sau.

find . -iname .svn -exec bash -c 'rm -rf {}' \; 

Tùy chọn exec sẽ được hạnh phúc để thấy rằng bạn chỉ cần gọi một thực thi với một cuộc tranh cãi, nhưng lập luận của bạn sẽ có thể chứa một kịch bản của cơ bản bất kỳ kích thước và hình dạng.

find . -iname .svn -exec bash -c ' 
    ls -l "{}" | wc -l 
' \; 
Các vấn đề liên quan