2009-08-18 69 views
177

Một trong những nhiệm vụ của một công cụ xuất mà tôi có trong ứng dụng của mình là dọn sạch tất cả các thư mục .svn từ cây thư mục ứng dụng của tôi. Tôi đang tìm một lệnh đệ quy trong vỏ Linux sẽ đi qua toàn bộ cây và xóa các tệp .svn.Cách xóa tất cả thư mục .svn khỏi thư mục ứng dụng của tôi

Tôi không sử dụng xuất, vì tập lệnh này sẽ được sử dụng cho một số tên tệp/thư mục khác không liên quan đến SVN. Tôi cố gắng một cái gì đó như:

find . -name .svn | rm -fr 

Nó không làm việc ...

+3

lệnh của bạn nên có tác dụng nếu bạn sử dụng 'xargs rm -rf' –

+1

Bạn cũng có thể muốn thay đổi các lệnh xóa "rm -rfi "chỉ để đảm bảo bạn là người tích cực bạn muốn xóa các thư mục. – bedwyr

+0

Không sử dụng xargs mặc dù .. bạn sẽ gặp rắc rối với các thư mục có dấu cách trong đó, vv Sử dụng tìm như được mô tả bên dưới. –

Trả lời

408

Hãy thử điều này:

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

Trước khi chạy một lệnh như vậy, tôi thường muốn chạy này đầu tiên:

find . -name .svn -exec ls '{}' \; 
+43

Bạn có thể cần đặt {} vào dấu nháy đơn nếu có thể có dấu cách hoặc ký tự như vậy trong thư mục: 'tìm. -name .svn -exec rm -rf '{}' \; ' – mtoloo

+36

Bài kiểm tra này hoạt động tốt hơn trong bash của tôi:' find. -name .svn -exec echo {} \; ' –

+4

Chạy echo/ls trước tiên là liên lạc 'pro' đối với câu trả lời này. Bất kỳ kẻ ngốc nào cũng có thể phá hỏng một hệ thống. –

9

Bạn gần như đã có nó. Nếu bạn muốn truyền đầu ra của một lệnh dưới dạng tham số cho một lệnh khác, bạn sẽ cần phải sử dụng xargs. Thêm -print0 đảm bảo các kịch bản có thể xử lý những con đường với khoảng trắng:

find . -type d -name .svn -print0|xargs -0 rm -rf 
+2

cho một số tiếng vang những gì làm việc cuối cùng đã được tìm thấy. -name .svn | xargs rm -rf Phiên bản của bạn đã cho tôi hướng mặc dù, nhờ –

+0

hoạt động trong vỏ cá theo osx – mcuadros

3

Hãy thử điều này:

find . -name .svn -exec rm -v {} \; 

Tìm hiểu thêm về lệnh find tại developerWorks.

11

Nếu bạn không muốn nhìn thấy rất nhiều

find: `./.svn': No such file or directory 

cảnh báo, sau đó sử dụng công tắc -depth:

find . -depth -name .svn -exec rm -fr {} \; 
4
find . -name .svn |xargs rm -rf 
2

Ngoài ra, nếu bạn muốn xuất một bản sao mà không sửa đổi các bản sao làm việc, bạn có thể sử dụng rsync:

rsync -a --exclude .svn path/to/working/copy path/to/export 
+1

Hoặc sử dụng svn export/path/to/repository, về cơ bản cũng làm như vậy. –

+0

Tác giả đặc biệt nói rằng ông không muốn sử dụng svn; có lẽ môi trường mục tiêu của anh ta không được cài đặt svn. – pimlottc

50

gì bạn đã viết gửi một danh sách các newline tách ra tên tập tin (và đường dẫn) đến rm, nhưng rm không biết phải làm gì với đầu vào đó. Nó chỉ mong đợi các tham số dòng lệnh.

xargs có đầu vào, thường ngăn cách bởi dòng mới, và đặt chúng trên dòng lệnh, vì vậy thêm xargs làm những gì bạn đã làm việc:

find . -name .svn | xargs rm -fr 

xargs đủ thông minh rằng nó sẽ chỉ vượt qua nhiều đối số rm vì nó có thể chấp nhận. Do đó, nếu bạn có một triệu tệp, nó có thể chạy rm 1.000.000/65.000 lần (nếu vỏ của bạn có thể chấp nhận 65,002 đối số trên dòng lệnh {65k tệp + 1 cho rm + 1 cho -fr}).

Là người đã adeptly chỉ ra, sau đây cũng làm việc:

find . -name .svn -exec rm -rf {} \; 
find . -depth -name .svn -exec rm -fr {} \; 
find . -type d -name .svn -print0|xargs -0 rm -rf 

Hai -exec hình thức đầu tiên cả hai gọi rm cho mỗi thư mục bị xóa, vì vậy nếu bạn đã có 1.000.000 thư mục, rm sẽ được gọi 1.000.000 lần .Điều này chắc chắn là ít hơn lý tưởng. triển khai bản mới hơn của rm cho phép bạn kết thúc lệnh với một + chỉ ra rằng rm sẽ chấp nhận như nhiều tranh cãi càng tốt:

find . -name .svn -exec rm -rf {} + 

Phát hiện cuối cùng/xargs phiên bản sử dụng print0, mà làm cho tìm tạo ra sử dụng \0 như một terminator hơn là một dòng mới. Vì các hệ thống POSIX cho phép bất kỳ ký tự nào nhưng \0 trong tên tệp, đây thực sự là cách an toàn nhất để đảm bảo rằng các đối số được chuyển chính xác đến rm hoặc ứng dụng đang được thực hiện.

Ngoài ra, có -execdir sẽ thực thi rm từ thư mục mà tệp được tìm thấy, thay vì tại thư mục cơ sở và -depth sẽ bắt đầu với độ sâu đầu tiên.

+2

Upvote chỉ vì bạn đang sử dụng xargs. – Augusto

9

Trong Windows, bạn có thể sử dụng tập lệnh đăng ký sau để thêm "Xóa thư mục SVN" vào menu ngữ cảnh nhấp chuột phải. Chạy nó trên bất kỳ thư mục có chứa những tập tin pesky.

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] 
@="Delete SVN Folders" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command] 
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \"" 
+0

Bí quyết gọn gàng. Không hữu ích cho OP, nhưng 1 vì tôi đã rất ấn tượng! – rrhartjr

+0

điều này thật tuyệt vời. cảm ơn. tôi biết điều này là siêu cũ, nhưng bất cứ điều gì. tôi vẫn thích nó. – Anthony

31

Không cần cho ống, xargs, exec, hoặc bất cứ điều gì:

find . -name .svn -delete 

Edit: Just kidding, rõ ràng -delete cuộc gọi unlinkat() dưới mui xe, vì vậy nó hoạt động như unlink hoặc rmdir và sẽ từ chối hoạt động trên các thư mục chứa các tệp.

+0

đẹp. cảm ơn. không nhận thức được đối số '-delete' –

+52

Một vấn đề,' -delete' sẽ không chạm vào thư mục nếu nó chứa tệp. – Xeoncross

+2

Không có cờ '-force' hoặc đệ quy cho vị từ' -delete', vì vậy câu trả lời này là vô dụng. Vì vậy, nó trở lại '| xargs rm -rf', ít xấu xí hơn khi gõ' -exec' với các phần giữ chỗ và dấu chấm phẩy xấu xí của nó: '-exec rm -rf '{}' \;'. –

11

Đã có nhiều câu trả lời được cung cấp để xóa thư mục .svn. Nhưng tôi muốn thêm vào, bạn có thể tránh được những thư mục ngay từ đầu, nếu bạn làm một xuất khẩu thay vì một thanh toán:

svn export <url> 
+0

+1, không cần phải làm lại khi nó đã được tích hợp sẵn vào svn. – Powerlord

+1

Chỉ có vấn đề tôi thấy với phương pháp này là nếu bạn muốn giữ lại các tập tin không phiên bản trong xuất khẩu. Từ các tài liệu svn, "Tất cả các thay đổi cục bộ sẽ được giữ nguyên, nhưng các tệp không thuộc quyền kiểm soát phiên bản sẽ không được sao chép." – raidfive

+0

@raidfive: Thông thường tôi thích có tất cả các tệp có liên quan dưới sự kiểm soát phiên bản, thậm chí là các thư viện được sử dụng để dự án hoạt động ngoài hộp. Các tập tin không phiên bản trong thiết lập này được biên dịch nhị phân, được làm lại bằng một mục tiêu trong buildfile. Nhưng bạn nói đúng, nếu dự án của bạn dựa vào các tệp không nằm dưới sự kiểm soát phiên bản, một quá trình xuất sẽ không hoạt động. – Mnementh

4

Là một vấn đề quan trọng, khi bạn muốn sử dụng vỏ xóa svn thư mục Bạn cần tham số -depth để ngăn lệnh tìm nhập vào thư mục vừa bị xóa và hiển thị thông báo lỗi như vd

"find: ./.svn: No such file or directory" 

Kết quả là, Bạn có thể sử dụng tìm lệnh như dưới đây:

cd [dir_to_delete_svn_folders] 
find . -depth -name .svn -exec rm -fr {} \; 
+0

Đây là những gì tôi đang tìm kiếm và phải là câu trả lời đúng. – luckytaxi

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