![디렉터리 계층 구조(파일 생략)를 다른 디렉터리에 복사하는 방법은 무엇입니까?](https://linux55.com/image/169264/%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EA%B3%84%EC%B8%B5%20%EA%B5%AC%EC%A1%B0(%ED%8C%8C%EC%9D%BC%20%EC%83%9D%EB%9E%B5)%EB%A5%BC%20%EB%8B%A4%EB%A5%B8%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%20%EB%B3%B5%EC%82%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다른 디렉터리에 복사하려는 하위 디렉터리가 있는 디렉터리가 있습니다. 나의 현재 순진한 접근 방식은 다음과 같습니다.
find src_dir -type d -exec mkdir -p dest_dir/{} \;
작동하지만 mkdir
순서대로 많은 중복 호출을 수행합니다.
또한 참고로 다음을 시도했습니다.
# real fast
find src_dir -type d >/dev/null
# also real fast
find src_dir -type d -exec true {} +
# slower, but not as slow as mkdir
find src_dir -type d -exec true {} \;
중복성을 줄이고 exec 호출을 줄이는 더 좋은 방법이 있습니까?
답변1
rsync 및 필터링(-f)을 사용하면 다음과 같이 디렉터리를 필터링하고 다른 모든 항목을 필터링할 수 있습니다.
rsync -av -f "+ */" -f "- *" src_dir/ new_dir/
답변2
;
이를 변경하여 프로세스 호출 수를 줄일 수 +
있습니다 . find ... -exec
이 경우 셸의 작은 부분을 사용하여 전달될 디렉터리 목록을 확장해야 합니다.
find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +
echo
예상대로 작동하면 만족스러운 두 인스턴스를 삭제합니다. (특별히 주의할 점은 로 끝날 것입니다 dest_dir/src_dir/...
. 이를 원하지 않으면 이 유형의 구성을 사용하고 dest_dir
절대 경로로 다시 작성해야 한다는 점을 기억하십시오.)
cd src_dir && find -type d ...