존재하지 않는 경우 파일을 cp하고 디렉토리를 만드는 방법은 무엇입니까?


15

디렉토리 구조를 유지하면서 svn 저장소의 수정 된 파일을 다른 디렉토리로 복사하고 싶습니다.

awk 및 xargs 맨 페이지를 읽은 후 다음과 같이 변경된 파일 이름을 얻는 방법을 찾습니다.

$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/

그러나 문제는 이런 식으로 디렉토리 구조가 유지되지 않기 때문에 다음과 같은 파일을 복사하고 싶습니다.

./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h

cp 명령을 cp '{}'/ tmp / xen / '{}'(으) 로 변경하려고 했지만 해당 파일이나 디렉토리가 없다고합니다. 필요한 경우 cp 복사 파일을 만들고 디렉토리를 만드는 방법이 있습니까? 그리고이 명령 체인을 단순화 할 수 있는지 지적하십시오. :-)

모든 답장을 보내 주셔서 감사합니다. 디렉토리가 약간 크기 때문에 cp -R 또는 rsync를 사용하여 전체 디렉토리를 복사하고 싶지 않습니다. 타르 파이프 사용에 대한 CK의 제안은 매우 유용합니다.

svn status -q | awk '{ print $2 }' | xargs tar cf -  | (cd /tmp/xen/; tar xvf -)

답변:


12

몇 가지 빠른 생각 :

  • mkdir에 추가하십시오 -p $ (dirname FILE)
  • 타르 파이프를 사용하여 모두 정리할 수 있습니까?

편집하다

 tar -cf archive.tar  `svn status -q | awk '{print $2}'`

수정 된 파일의 아카이브를 작성해야합니다. 그때:

  tar -xf archive.tar -C /tmp/xen

원하는 곳에 놓아야합니다. 한 단계 만 거치면 가능합니다.


4

rsync는 전체 디렉토리 구조를 복사하는 데 일반적으로 사용하는 도구를 매우 간단하게 만듭니다.

rsync -av /home/source/svn/repo /home/dest/svn/

그러면 repo 디렉토리와 모든 컨텐츠가 / home / dest / svn 디렉토리에 작성되므로 / home / dest / svn / repo / ...

예를 들어,

rsync -rv ./ /tmp/xen/

-a, 타임 스탬프를 보존하고 'man rsync'와 같이 재귀 적입니다.

내가 질문을 잘못 읽은 것을 깨달은 후 업데이트하십시오.

디렉토리 구조를 모방하려면 (tar 대안) :

rsync -av --include='*/' --exclude='*' source destination

그런 다음 20 분 전에 파일을 복사하려면 다음을 수행하십시오.

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/

그것은 명백한 일이지만 수정 된 파일뿐만 아니라 모든 것을 동기화합니다.
CK.

죄송합니다.
Kyle Brandt

2

여기 하나의 라이너가 있습니다.

svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen

그리고 영어로 :

  • 에 관심있는 파일 목록을 가져 svn status -q옵니다.
  • 파일 경로가있는 열을 추출하는 awk : awk '{print $2}'
  • xargs는 파일 목록을 tar에 제공하는 데 사용되며 파일의 tarball을 stdout으로 보냅니다. xargs tar -c
  • -x대상 디렉토리 ( -C path) 로 즉시 다시 추출 ( )됩니다 .tar -xC /tmp/xen

1

"dirname"을 사용하여 "mkdir -p"경로를 추출하여 다음과 같이 작성하십시오.

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/

1

rsync -a는 깊이 1보다 더 깊은 새 디렉토리를 만들지 않으므로 rsync는 부분 솔루션 일 뿐이며 나에게 적합하지 않습니다 (중간에 여러 디렉토리가 누락 된 경우 디렉토리를 일부 원격 계층 구조로 rsync하는 방법에 대한 답을 찾도록 googled )

편집 : 나는 소스 디렉토리가 있습니다 : /home/user/projects/homework/1/1.1/ 그리고 나는 그것을 원격으로 재 동기화하고 싶습니다 : /home/user/projects/homework/1/1.1/ ...하지만 대상 아직 / home / user / projects / homework 디렉토리가없고 / home / user / projects /에있는 소스 머신의 다른 서브 디렉토리를 전송하고 싶지 않습니다.

Edit2 : rsync --relative 옵션을 사용하여 방법을 찾았습니다. 위의 예는 다음과 같습니다.

cd / home / projects /; rsync -aR 숙제 /1/1.1 user @ remote : / home / user / projects /


0

나는 다음을 제안한다.

  • 모든 것을 복사
  • 수정되지 않은 파일을 찾아서 삭제하고 수정 된 파일은 그대로 둡니다.

그런데 R 플래그가있는 cp는 파일 / 폴더를 재귀 적으로 복사합니다.

cp -R

0
  • /tmp/f2파일의 디렉토리 구조를 빌드/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • 새로운 목적지로 파일 복사 /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.