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


192

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

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

find . -name .svn | rm -fr

작동하지 않았다 ...


3
당신이 'xargs를 RF RM은'사용하는 경우 귀하의 명령이 작동한다
— Heijden 데르 피터 밴을

1
디렉토리를 삭제하려는 것이 긍정적인지 확인하기 위해 delete 명령 "rm -rfi"를 수정할 수도 있습니다.
— bedwyr

xargs를 사용하지 마십시오. 공백이있는 디렉토리에는 문제가있을 수 있습니다. 아래 설명에 따라 find를 사용하십시오.
— John Hunt

답변:


438

이 시도:

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

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

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

43
디렉토리에 공백이나 문자가있을 경우 {}를 작은 따옴표로 find . -name .svn -exec rm -rf '{}' \;
— 묶어야

38
이 테스트는 내 bash에서 더 잘 작동합니다.find . -name .svn -exec echo {} \;
— Fedir RYKHTIK

6
echo / ls를 먼저 실행하는 것이이 답변에 대한 '프로'터치입니다. 어떤 바보라도 시스템을 망칠 수 있습니다.
— John Hunt

6
무엇을 {} \;합니까?
— Jon Mitten

3
를 포함하여 두 번째 명령을 실행하면 ls, 내가 얻을 entries prop-base props text-base tmp출력 ...
— Rasoul

51

작성한 내용은 개행으로 구분 된 파일 이름 (및 경로) 목록을 (으)로 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 가 있습니다.


31

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

find . -name .svn -delete

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


54
하나의 문제 -delete는 파일이 들어있는 디렉토리를 건드리지 않습니다.
— 제온 크로스

2
술어에 -force대한 플래그 가 없거나 재귀 적이므로이 -delete답변은 쓸모가 없습니다. 따라서으로 돌아가서 못생긴 자리 표시 자와 세미콜론 |xargs rm -rf으로 입력하기가 덜 추악합니다 . -exec-exec rm -rf '{}' \;
— Tomasz Gandor

13

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

svn export <url>

+1, 이미 svn에 내장되어있을 때 다시 실행할 필요가 없습니다.
— Powerlord

1
이 방법으로 볼 수있는 유일한 문제는 내보내기에서 버전없는 파일을 유지하려는 경우입니다. svn docs에서 "모든 로컬 변경 사항은 유지되지만 버전 관리가없는 파일은 복사되지 않습니다."
— raidfive

@raidfive : 일반적으로 프로젝트가 즉시 작동하도록 모든 관련 파일을 버전 제어 및 사용 된 라이브러리로 사용하는 것을 선호합니다. 이 설정에서 버전이없는 파일은 컴파일 된 바이너리이며 빌드 파일의 목표에 의해 다시 만들어집니다. 그러나 프로젝트가 버전 제어가 아닌 파일에 의존하는 경우 내보내기가 작동하지 않습니다.
— Mnementh

그러나 ...보다 일반적인 대답이 필요했습니다. .svn은 가장 일반적인 예일뿐입니다.
— Itay Moav-말리 모프 카

12

많이보고 싶지 않다면

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

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

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

10

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

깔끔한 트릭. OP에 도움이되지는 않았지만 +1이기 때문에 +1했습니다!
— rrhartjr 님이

대단해. 감사. 나는 이것이 매우 오래되었다는 것을 알고 있습니다. 어쨌든 좋아합니다.
— Anthony

9

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

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

2
어떤 공명을 위해 결국에는 효과가 있었던 것이 발견되었다. 을 .svn -name | xargs를 RF RM은 버전이, 나에게 감사 방향을하지만 준
— Itay Moav -Malimovka을


4

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

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

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

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

이것은 내가 찾고 있었고 정답이어야합니다.
— luckytaxi


2

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

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

1
또는 svn export / path / to / repository를 사용하면 본질적으로 동일한 작업을 수행합니다.
— Kaleb Pederson

저자는 특히 svn을 사용하고 싶지 않다고 말했다. 아마도 그의 대상 환경에는 svn이 설치되어 있지 않을 것입니다.
— pimlottc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.