이미지만 재귀적으로 복사하고 경로를 보존합니다.

이미지만 재귀적으로 복사하고 경로를 보존합니다.

웹사이트 마이그레이션 작업을 하고 있습니다. URL에 표시되는 모든 파일과 디렉터리 구조가 포함된 웹사이트의 스크린샷이 있습니다. 모든 이미지를 추출하고 디렉터리 구조를 유지하며 새 위치에 복사하고 싶습니다.

예를 들어, 내가 가지고 있는 경우

/content1/index.php
/content1/page2.php
/content1/images/image1.jpg
/content1/images/image2.jpg
/content1/background/spacer.gif
/content1/background/background.gif
/content2/index.php
/content2/images/image3.jpg
/content2/background/spacer.gif
/content2/background/background.gif

그럼 내가 원해

/content1/images/image1.jpg
/content1/images/image2.jpg
/content1/background/spacer.gif
/content1/background/background.gif
/content2/images/image3.jpg
/content2/background/spacer.gif
/content2/background/background.gif

명령을 사용하여 이미지 파일 목록만 얻을 수 있지만 find디렉터리 경로를 유지하면서 각 파일을 조작하는 방법을 모르겠습니다.

전체 디렉토리를 복사한 다음 이미지가 아닌 파일을 재귀적으로 삭제할 수 있지만 이제 이 문제를 내 자신 앞에 설정했으므로 실제로 이 작업을 수행해야 할 경우를 대비해 어떻게 수행하는지 알 가치가 있다고 생각합니다. 미래. .

답변1

다음 명령( findcp옵션 --parent)을 사용해 보십시오.

find /source -regextype posix-extended -regex '.*(gif|jpg)' \
    -exec cp --parents {} /dest \; -print

답변2

사용공원(또는 그 이전 버전인 cpio 또는 tar 중 하나)가 복사 모드에 있습니다. 필요한 파일( .jpg또는 .gif)만 복사하도록 지시합니다. 구문은 약간 우회적입니다. -s옵션은 파일 이름을 빈 이름으로 바꾸는 방법을 지정하며, 첫 번째 일치 항목이 적용되므로 대부분의 파일을 제외하려면 이름 바꾸기를 포함하는 것이 좋습니다. 의 파일 자체를 삭제하고 나머지 파일은 제외합니다. 디렉토리는 이 방법으로 복사되지 않지만 pax가 복사하는 경우 foo/bar/qux.jpg필요한 경우 대상에 및 을 생성하고 foo제외된 디렉토리 내에서도 pax가 반복됩니다.foo/bar

pax -rw -pp -s '!\.gif$!&!' -s '!\.jpg$!&!' -s '!.*!!' /content* /destination

rsync를 사용하여 복사를 수행할 수도 있지만 번거롭습니다. rsync는 제외된 디렉터리를 복사하지 않으므로 모든 디렉터리를 포함시킨 다음 빈 디렉터리를 제거하거나 복사할 디렉터리 목록을 생성해야 합니다. 바라보다이 답변설명을 위해.

rsync -a --include='*.gif' --include='*.jpg' --include='*/' \
      --exclude='*' /content* /destination

답변3

모든 *.conf 파일을 /etc/에서 /tmp/로 복사한다고 가정해 보겠습니다. 다음을 수행해야 합니다.

tar c $(find /etc/ -name '*.conf') | tar xv -C /tmp

작동 방식:

  1. 다음을 통해 올바르게 복사할 파일 목록을 만듭니다.$(find ...)
  2. tar c새로운 tar 아카이브를 생성하고 이를 stdout에 전달합니다.
  3. |압축을 풀기 위해 아카이브를 다른 tar 프로세스로 파이프하십시오.
  4. tar xv표준 입력에서 자세한 추출 아카이브를 읽습니다. 단, 디렉토리는 /tmp(대상)으로 변경됩니다.

이 방법은 공백이 포함된 파일을 올바르게 처리하지 못합니다. 이 문제를 해결하려면 파일 목록을 생성하고 -T 옵션을 첫 번째 tar 명령에 전달할 수 있습니다.

답변4

같은 대답이지만 Mac --parents에서는 작동하지 않기 때문에 Mac의 경우입니다 cp.

 find /source/dir -type f \( -iname "*.jpg" -o -iname "*.png" -o -iname "*.jpeg"   \) -exec rsync -R {} ../destination/dir \;

관련 정보