내 응용 프로그램에있는 내보내기 도구의 임무 중 하나는 .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
xargs
rm
받아 들일 수있는 만큼만 많은 인수를 전달할 정도로 지능적 입니다. 따라서 백만 개의 파일이있는 경우 rm
1,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