웹사이트 마이그레이션 작업을 하고 있습니다. 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
다음 명령( find
및 cp
옵션 --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
작동 방식:
- 다음을 통해 올바르게 복사할 파일 목록을 만듭니다.
$(find ...)
tar c
새로운 tar 아카이브를 생성하고 이를 stdout에 전달합니다.|
압축을 풀기 위해 아카이브를 다른 tar 프로세스로 파이프하십시오.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 \;