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