development

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

big-blog 2020. 5. 14. 20:34
반응형

내 응용 프로그램 디렉토리에서 모든 .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 {} \;

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

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

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

find . -name .svn |xargs rm -rf

중요한 문제로 을 사용하여 .svn 폴더를 삭제 하려는 경우 find 명령이 방금 삭제 된 디렉토리에 들어가서 다음과 같은 오류 메시지를 표시하지 못하게 하려면 -depth 인수가 필요합니다.

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

결과적으로 아래와 같이 find 명령을 사용할 수 있습니다.

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

이 시도:

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

developerWorks 에서 find 명령에 대해 자세히 읽으십시오 .


또는 작업 사본을 수정하지 않고 사본을 내보내려면 rsync를 사용할 수 있습니다.

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

참고 URL : https://stackoverflow.com/questions/1294590/how-to-remove-all-svn-directories-from-my-application-directories

반응형