OS X에서 Subversion 파일 및 폴더를 제외한 모든 파일 및 폴더 복사


14

모든 파일과 폴더를 한 디렉토리에서 다른 디렉토리로 복사하려고하지만 특정 파일을 제외하려고합니다. 특히 하위 버전 파일과 폴더를 제외하고 싶습니다. 그러나 나는 일반적이지만 간결한 솔루션을 원합니다.

가까운 시일 내에 여러 유형의 파일을 제외해야 할 필요가 있다고 생각합니다. 예를 들어 .svn, * .bak 및 * .prj를 제외 할 수 있습니다.

여기 내가 함께 모은 것이 있지만 그것은 나를 위해 작동하지 않습니다. 첫 번째 부분은 작동하지만 xargscp에 문제가 있습니다. 나는 cp를 사용하거나 사용하지 않고 cp 를 시도했다 -R. 또한 OS X를 사용하고 있으며 Linux 시스템보다 xargs의 기능이 적은 버전으로 보입니다 .

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory

틀릴 수도 있지만 생각보다 까다 롭습니다. find명령이 -prune.svn 항목을 제외시키는 데 올바르게 사용 하더라도 , 해당 명령이 재귀적임 을 알리는 -R플래그를 전달합니다 . 그렇게 할 때, 당신은 당신이 명령에 가지고 있던 세분성을 잃게됩니다 . 잠깐이 어설프게 갈거야,하지만 난 대답은 생각 하지 사용 에서 명령. cpfind-Rcp
Telemachus

Linux 시스템에서 작동하는 것 같습니다. "작동하지 않습니다"가 무엇을 의미하는지 더 구체적으로 설명 할 수 있습니까? 오류 메시지가 있습니까? 예상 한 파일을 복사하거나 가져 오지 않습니까?
추후 공지가있을 때까지 일시 중지되었습니다.

그것은이다 -R나는 확신, 플래그. 그것을 제거하면 괜찮을 것입니다 ( -mindepth 1복사하지 않으려는 최상위 디렉토리 폴더를 무시 하기 위해 추가하고 싶을 수도 있습니다 )
Telemachus

나는 보통 모든 것을 복사 한 다음 대상 디렉토리에서 원하지 않는 파일을 삭제하여 이러한 작업을 수행합니다. 종종 훨씬 간단합니다.
Jan Doggen

답변:


22

(질문을 다시 읽은 후에 편집됩니다. 질문자에 rsync가 설치되지 않았다고 표시됩니다)

find / xargs 솔루션의 가능한 문제는 파일 이름의 공백입니다. 이를 해결하려면 find 및 xargs에게 널 문자 (ASCII 0)를 사용하여 찾은 파일을 분리하도록 지시하십시오.

find ./sourcedirectory -not ( -name .svn -a -prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory

rsync가 사용 가능하다는 것을 알면 rsync가 훨씬 더 나은 솔루션이라고 생각합니다.

-C 옵션과 함께 rsync를 사용하십시오. 로부터 rsync를 man 페이지 :

시스템간에 전송하지 않으려는 광범위한 파일을 제외하는 데 유용한 축약 형입니다. 파일을 무시해야하는지 결정하기 위해 CVS와 유사한 알고리즘을 사용합니다.

이것은 rsync에게 다음 패턴을 무시하도록 지시합니다.

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~
#* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj 
*.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/

예를 들면 다음과 같습니다.

rsync -avC /path/to/source/directory /path/to/destination/directory

(참고 : rsync에 아직 익숙하지 않은 경우, rsync가 소스 경로의 후행 슬래시를 처리하는 방법에 대한 해당 맨 페이지를 읽으십시오. 슬래시를 포함하지 않으면 다른 방식으로 작동합니다. '후행 슬래시'검색)


쥐, 나는 단지 당신의 질문을 다시 읽고 당신이 rsync가 설치되어 있지 않다고 말한 것을 보았습니다. MacBook Pro (OS X 10.6.1)에서는 / usr / bin / rsync에 있습니다. Tiger (10.4)와 Leopard (10.5)에서도 설치되었습니다.
Doug Harris

나는 당신 (그리고 OP)이 명령 -Rxargs일부 에서 깃발을 원하지 않는다고 확신합니다 .
Telemachus

잘 잡았습니다. 원래 질문에서 복사했습니다. 지금 편집하겠습니다.
Doug Harris

1
고마워요 더그! 내가 설교하는 한 가지는 "직무에 맞는 도구를 사용하는 것"입니다. 나는 최근에 Windows 세계에서 OSX로 왔으며 여전히 무지하게 혼란에 빠져 있습니다. 나는 같은 질문을 리눅스 채널에 올렸고 누군가가 "rsynch"를 사용하여 터미널에 "rsynch"를 입력하고 존재하지 않는 것을 발견하고 찾기를 계속 조사했다. xargs 접근. 나는 그렇게 완고합니다. 어쨌든 OSX에는 기본적으로 "rsync"가 있으며 게시물이 매우 유용했습니다. 나는 아직 어느 것이 더 낫다는 것을 알기에 충분한 경험이 없지만 rsync sure는 훨씬 더 간결합니다. 감사!
Michael Prescott

OS X에 대한 작업 외에도 Linux 시스템에서 작업을 수행하는 경우 rsync 사용법을 배우는 것이 가치가 있다고 생각합니다. 주요 기능은 변경된 내용을 지능적으로 복사하는 것입니다 (예 : 익숙한 경우 Windows의 robocopy). 델타 만 복사하기 때문에 (타임 머신이 아닌) 백업, 코드 배포 등을 처리 할 수있는 좋은 방법입니다.
Doug Harris

2

일반적인 해결책은 아니지만 .... svn export 명령을 사용하여 .svn 메타 데이터 폴더없이 작업 공간의 사본을 만들 수 있습니다.


공격적이지는 않지만이 답변이 왜 투표를 받는지 잘 모르겠습니다. svn의 기능을 알고 있지만 "일반적인 간결한 솔루션을 원합니다. 가까운 시일 내에 여러 유형의 파일을 제외해야 할 것 같습니다"
Michael Prescott

2
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

원하는 경우 2 tar 프로세스 사이에 'pv'또는 이와 유사한 것을 넣을 수도 있습니다.


2

더럽지 만 빠르고 간결한 방법 :

cp -r source destination
find destination -iname .svn |xargs rm -rf

이것은 하나의 디렉토리를 다른 디렉토리에 복사하고 (따라서 재귀 옵션 -r), 이름이 지정된 것을 재귀 적으로 지 웁니다 .svn(대소 문자 무시).


1

tar와 exclude 메커니즘을 사용하여 다른 방식으로 진행할 것입니다.

대상 디렉토리에서 :

tar -X excludefile -C source -f - . | tar xf -

이것은 cd로 들어가서 excludefile에 나열된 내용을 제외하고 내용을 tar 한 다음 현재 디렉토리로 untar합니다.


실제로 우아한 솔루션.
Nick Stinemates

글쎄, 그것은 나중에 내가 준 것과 같은 대답입니다. 게다가 당신은 대상 디렉토리에 있어야합니다 ... :)
akira

0

편집 된 답변 : 문제는 -R복사를 재귀 적으로 만들어서 숨겨진 파일을 복사하게하는 것입니다. 내가 사용하는 것은 다음과 같습니다.

find source/  -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/

-mindepth 1플래그는 말한다 find최상위 디렉토리를 무시. 해당 디렉토리의 모든 내용을 새로운 최상위 디렉토리에 복사하고 싶지 않기 때문에 원하지 않는 것으로 가정합니다.

Chris Nava 가 자신의 답변 에서 언급 했듯이 SVN 폴더에 대해 이야기하는 경우이를 수행하는 기본 제공 방법이 이미 있지만 더 일반적인 솔루션을 요청했기 때문에 약간 도움이 될 수 있습니다.


감사합니다 Telemachus, 도움이됩니다. 나는 비평을 한 경험이 없지만 원래 게시물 이후로 들었던 것을 반복 할 것입니다. "xargss broken"알려지지 않은 irc 주석자가 저를 좀 더 둘러 보라고 영감을 주었고 Doug Harris의 대답이 문제를 해결한다고 생각합니다. xargs에게 널 문자를 사용하도록 지시합니다. 나는 그것이 -0 스위치라고 생각합니까?
Michael Prescott

@Michael : xargs깨지지는 않지만 Unix 계열 시스템에서는 기본값으로 공백이있는 파일 이름 (또는 디렉토리 이름)을 사용하지 않습니다. 파일 이름 (또는 디렉토리 이름)에 공백이나 "재미있는"문자가 있으면이를 처리하기 위해 추가 작업을 수행해야합니다. (에서 GNU는 find의에 전체 섹션이 man있기 때문에이 문제의 "특수한 FILENAMES"라는 페이지하십시오.) -0에서 플래그 xargs-print0대한 find이 문제를 처리하는 데 도움이됩니다. 그러나 -R복사 명령 에 사용하고 싶지 않다고 약속합니다 . SVN 디렉토리를 피하기 위해 수행 한 모든 작업을 취소합니다.
Telemachus

0

나는 그것이 나무의 크기에 달려 있다고 생각하지만 , 모든 것을 먼저 복사 한 다음 .svn 폴더를 자르십시오.

find /dest-dir -type d -name .svn -exec rm -rf {} \;

?


벤치마킹 없이는 처음에는 이것이 CPU 사이클의 두 배 낭비 인 복사 및 제거라는 생각입니다. 올바른 find명령 을 만드는 데 약간의 시간이 더 걸릴 수 있지만 한 번만 수행하면됩니다. 일단 명령이 올 바르면 수백 번 사용할 수 있습니다.
Telemachus

@ Telemachus-사실이지만 컴퓨터가 잘되는 것입니다-까다로운 일을하므로 우리는 할 필요가 없습니다! 실제로-일부 파일을 복사 한 후 곧 삭제하도록 일부 파일을 복사하면 어떤 해가 있습니까?
Steve Folly

@Steve : 실제로 아무런 해가 없습니다. 가능한 한 이것은 훌륭한 솔루션입니다. 그것은 내가 좋아하는 한 가지 원칙을 따릅니다. "가장 간단한 일을하십시오." 다른 한편으로, 그것은 내가 더 좋아하는 또 다른 원칙 인 "도구 배우기"를 위반합니다. 나는 find더 잘 사용하는 법을 배우기를 원하기 때문에 이것을 할 필요가 없었습니다. 그러나 당신은 옳습니다 :이 솔루션에는 아무런 문제가 없습니다.
Telemachus

@ Telemachus : "도구 배우기"에 동의합니다. 내가 시작했을 때, 나는 확신 내 find 명령은 위 :-) 다음 나에게 매우 비밀 보였다 것
스티브 어리 석음


0

반대로 할 수도 있습니다. 모든 것을 복사 한 후 아래 명령을 사용하여 .svn 폴더를 삭제하십시오.

find . | grep ".svn" | xargs rm -rf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.