파일이 존재하지 않는 경우에만 디렉토리 구조의 모든 파일을 특정 경로로 복사하십시오.


8

파일이없는 경우에만 디렉토리 구조에서 특정 디렉토리로 모든 파일을 복사하려고합니다.

이 스택 오버플로 질문 에서 첫 번째 부분을 얻었습니다 .

find . -type f -exec cp {} /target-directory \;

파일이 있는지 여부를 어떻게 확인할 수 있습니까? 그렇지 않으면 파일을 복사하고, 그렇지 않으면 건너 뜁니다.


"소스 트리의 모든 파일을 서브 디렉토리가없는 (특정) 단일 디렉토리로 복사"를 의미합니까? 또는 "소스 트리의 모든 파일을 소스 트리의 위치와 유사한 대상 디렉토리의 하위 디렉토리로 복사"합니까? 질문을 첫 번째 사례로 읽었습니다. 명확히하기 위해 질문을 편집 할 수 있습니까? (나는 당신이 당신의 대답을 알고 있지만 다른 사람들이 그것을 읽고 사용할 것입니다.)
Volker Siegel

답변:


13

-uswitch from cpcommand를 사용할 수 있습니다 .

SOURCE 파일이 대상 파일보다 최신이거나 대상 파일이 누락 된 경우에만 복사

또는 다음 rsync과 함께 명령을 사용하십시오 --ignore-existing.

수신자에 존재하는 파일 업데이트 생략

예:

rsync --ignore-existing source/* destination/

3

원래 명령은 다음과 같이 다시 작성할 수 있습니다.

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

여기서 핵심은 특정 명령으로 쉘을 호출하고 찾은 파일을 $1인수 로 전달한다는 것 입니다. 경우 test -e /target-directory/"$1"에 실패, 그 수단 파일이있는 경우, 존재하지 않는 cp파일을 복사합니다.

일반적으로 명령이 파일의 존재를 확인할 수있는 한 다른 명령을 사용할 수 있습니다. 다른 대안 중 일부 :

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

2
statBash에 파일이 존재하는지 테스트해야하는 이유는 무엇 입니까? test -e훨씬 간단 하지 않습니까?
David Foerster 7

@DavidFoerster 특별한 이유가 없습니다. 테스트 명령도 수행됩니다. 잊어 버리면 나중에 답변을 편집하겠습니다.
Sergiy Kolodyazhnyy 2016 년

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