Làm cách nào để xóa tất cả các thư mục .svn khỏi các thư mục ứng dụng của tôi


192

Một trong những nhiệm vụ của một công cụ xuất khẩu mà tôi có trong ứng dụng của mình, là dọn sạch tất cả các .svnthư mục khỏi cây thư mục ứng dụng của tôi. Tôi đang tìm kiếm một lệnh đệ quy trong trình bao Linux sẽ đi ngang qua toàn bộ cây và xóa các .svntệp.

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 đã thử một cái gì đó như:

find . -name .svn | rm -fr

Nó không hoạt động ...


3
Lệnh của bạn sẽ hoạt động nếu bạn sử dụng 'xargs rm -rf'
Peter van der Heijden

1
Bạn cũng có thể muốn sửa đổi lệnh xóa "rm -rfi" chỉ để đảm bảo rằng bạn muốn xóa các thư mục.
bedwyr

Đừ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ó khoảng trắng trong đó, v.v ... Sử dụng find như được mô tả dưới đây.
John Hunt

Câu trả lời:


438

Thử cái này:

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

Trước khi chạy một lệnh như vậy, tôi thường thích chạy lệnh này trước:

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

43
Bạn có thể cần đặt {} vào một trích dẫn nếu có thể có khoảng find . -name .svn -exec rm -rf '{}' \;
trắng

38
Thử nghiệm này hoạt động tốt hơn trong bash của tôi:find . -name .svn -exec echo {} \;
Fedir RYKHTIK

6
Chạy echo / ls trước tiên là cảm ứng 'pro' cho 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.
John Hunt

6
những gì hiện {} \;làm gì?
Jon Mitten

3
Bằng cách chạy lệnh thứ hai bao gồm ls, tôi nhận được entries prop-base props text-base tmpđầu ra ...
Rasoul

51

Những gì bạn đã viết sẽ gửi một danh sách các tên tệp (và đường dẫn) được phân tách dòng mới tới 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 lấy đầu vào, thường được phân tách bằng các dòng mới và đặt chúng vào dòng lệnh, vì vậy việc thêm xargs làm cho những gì bạn đã làm:

find . -name .svn | xargs rm -fr

xargsđủ thông minh để nó chỉ vượt qua càng nhiều đối số rmmà nó có thể chấp nhận. Do đó, nếu bạn có một triệu tệp, nó có thể chạy rm1.000.000 / 65.000 lần (nếu trình bao 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}).

Như mọi người đã chỉ ra một cách lão luyện, những điều sau đây cũng có tác dụng:

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

Cả hai -exechình thức đầu tiên đều gọi rmcho mỗi thư mục bị xóa, vì vậy nếu bạn có 1.000.000 thư mục, rmsẽ được gọi 1.000.000 lần. Điều này chắc chắn là ít hơn lý tưởng. Việc triển khai mới hơn rmcho phép bạn kết thúc lệnh với một +dấu hiệu rmsẽ chấp nhận càng nhiều đối số càng tốt:

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

Phiên bản find / xargs cuối cùng sử dụng print0, giúp tìm đầu ra tạo ra sử dụng \0như một bộ kết thúc thay vì 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 \0trong 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 truyền chính xác rmhoặc ứng dụng được thực thi.

Ngoài ra, có một tệp -execdirsẽ thực thi rmtừ thư mục chứa tệp, thay vì ở thư mục cơ sở và tệp -depthsẽ bắt đầu sâu trước.


31

Không cần ống, xargs, exec, hoặc bất cứ thứ gì:

find . -name .svn -delete

Chỉnh sửa: Đùa thôi, rõ ràng là -deletegọi unlinkat()dưới mui xe, vì vậy nó hoạt động như unlinkhoặc rmdirvà sẽ từ chối hoạt động trên các thư mục chứa tệp.


54
Một vấn đề, -deletesẽ không chạm vào một thư mục nếu nó chứa các tập tin.
Xeoncross

2
Không có -forcehoặc đệ quy cờ cho -deletevị ngữ, vì vậy câu trả lời này là vô ích. Do đó, nó trở lại |xargs rm -rf, loại ít xấu hơn để gõ sau đó -execvới chỗ giữ chỗ xấu xí và dấu chấm phẩy : -exec rm -rf '{}' \;.
Tomasz Gandor

13

Đã 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, rằng bạn có thể tránh các thư mục này ngay từ đầu, nếu bạn thực hiện xuất thay vì thanh toán:

svn export <url>

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

1
Vấn đề duy nhất tôi thấy với cách tiếp cận này là nếu bạn muốn giữ lại các tệp không đảo ngược trong quá trình xuất. 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 kiểm soát phiên bản sẽ không được sao chép."
raidfive

@stonfive: 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í các thư viện đã sử dụng, để dự án hoạt động tốt. Các tệp không đảo ngược trong thiết lập này là các tệp nhị phân được biên dịch, được làm lại bởi một mục tiêu trong tệp xây dựng. Nhưng bạn đã đúng, nếu dự án của bạn dựa vào các tệp không thuộc quyền kiểm soát phiên bản, việc xuất sẽ không hoạt động.
Mnementh

nhưng ... tôi cần một câu trả lời tổng quát hơn. .Svn chỉ là ví dụ phổ biến nhất, tôi lưu ý rằng trong câu hỏi.
Itay Moav -Malimovka

12

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

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

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

find . -depth -name .svn -exec rm -fr {} \;

10

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 các 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\" \""

Trò hay. Không hữu ích cho OP, nhưng +1 vì tôi rất ấn tượng!
rrhartjr

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

9

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

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

2
đối với một số cộng hưởng 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 đi, cảm ơn
Itay Moav -Malimovka


4

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

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

Do đó, bạn có thể sử dụng lệnh find như bên dưới:

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

Đây là những gì tôi đang tìm kiếm và nên là câu trả lời chính xác.
luckytaxi 3/03/2016


2

Ngoài ra, nếu bạn muốn xuất bản sao mà không sửa đổi bản sao đang hoạt động, 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 thực hiện điều tương tự.
Kaleb Pederson

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ài đặt svn.
pimlottc
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.