[linux] 내 응용 프로그램 디렉토리에서 모든 .svn 디렉토리를 제거하는 방법

내 응용 프로그램에있는 내보내기 도구의 임무 중 하나는 .svn응용 프로그램 디렉토리 트리에서 모든 디렉토리 를 정리하는 것 입니다. Linux 셸에서 전체 트리를 통과하고 .svn파일을 삭제하는 재귀 명령을 찾고 있습니다.

이 스크립트는 SVN과 관련이없는 다른 파일 / 디렉토리 이름에 사용되므로 내보내기를 사용하지 않습니다. 나는 다음과 같은 것을 시도했다 :

find . -name .svn | rm -fr

작동하지 않았다 …



답변

이 시도:

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

그런 명령을 실행하기 전에 종종 이것을 먼저 실행하고 싶습니다.

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


답변

작성한 내용은 개행으로 구분 된 파일 이름 (및 경로) 목록을 (으)로 rm보내지 만 rm은 해당 입력으로 수행 할 작업을 모릅니다. 명령 줄 매개 변수 만 기대하고 있습니다.

xargs 일반적으로 줄 바꿈으로 구분 된 입력을 받아 명령 줄에 배치하므로 xargs를 추가하면 작업 한 내용이 만들어집니다.

find . -name .svn | xargs rm -fr

xargsrm받아 들일 수있는 만큼만 ​​많은 인수를 전달할 정도로 지능적 입니다. 따라서 백만 개의 파일이있는 경우 rm1,000,000 / 65,000 회 실행될 수 있습니다 (쉘이 명령 행 {65k 파일 + 1-rm의 경우 +–fr의 경우 65,002 개의 인수를 승인 할 수있는 경우).

사람들이 적절하게 지적했듯이 다음도 작동합니다.

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

처음 두 -exec양식은 모두 rm삭제되는 각 폴더를 호출 하므로 1,000,000 개의 폴더 rm가있는 경우 1,000,000 번 호출됩니다. 이것은 확실히 이상적이지 않습니다. 최신 구현을 rm통해 가능한 많은 인수를 허용 +한다는 표시로 명령을 완료 할 수 rm있습니다.

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

마지막 find / xargs 버전은 print0을 사용하므로 find \0는 개행 문자가 아닌 종료 자로 사용 되는 출력을 생성합니다 . POSIX 시스템 \0은 파일 이름을 제외한 모든 문자를 허용하므로 인수가 올바르게 전달 rm되거나 응용 프로그램에 전달되도록하는 가장 안전한 방법 입니다.

또한 기본 디렉토리가 아니라 파일을 찾은 디렉토리에서 -execdir실행 rm되고 -depth깊이가 먼저 시작 되는 a 가 있습니다.


답변

파이프, xargs, exec 등이 필요하지 않습니다.

find . -name .svn -delete

편집 : 농담, 분명히 후드 아래에서 -delete호출 unlinkat()하므로 파일이 포함 된 디렉토리에서 작동 unlink하거나 작동 rmdir하지 않습니다.


답변

.svn-directory 삭제에 대한 많은 답변이 이미 제공되어 있습니다. 그러나 체크 아웃 대신 내보내기를 수행하면 처음부터 이러한 디렉토리를 피할 수 있습니다.

svn export <url>


답변

많이보고 싶지 않다면

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

경고가 표시되면 -depth스위치 를 사용하십시오 .

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


답변

Windows에서는 다음 레지스트리 스크립트를 사용하여 마우스 오른쪽 버튼 클릭 상황에 맞는 메뉴에 “SVN 폴더 삭제”를 추가 할 수 있습니다. 성가신 파일이 들어있는 디렉토리에서 실행하십시오.

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


답변

당신은 거의 그것을했다. 명령 출력을 다른 매개 변수로 매개 변수로 전달하려면 xargs를 사용해야합니다. 추가 -print0하면 스크립트가 공백이있는 경로를 처리 할 수 ​​있습니다.

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