특정 이름의 파일을 복사하여 다른 폴더에 동일한 하위 폴더 만들기

특정 이름의 파일을 복사하여 다른 폴더에 동일한 하위 폴더 만들기

그 안에 많은 하위 폴더가 있는 디렉토리가 있고 하위 폴더 아래에 다른 하위 폴더가 있습니다. 모든 디렉터리와 하위 디렉터리를 다른 위치에 복사하고 계층 구조를 유지하면서 이 디렉터리에 특정 이름을 가진 파일만 복사하고 싶습니다.

모든 디렉터리와 하위 디렉터리가 복사되었다고 가정하면, 해당 디렉터리에 확장자를 가진 파일이 있으면 .txt해당 파일도 복사됩니다.

Unix/Linux 시스템에서 이를 수행하는 가장 좋은 방법은 무엇입니까?

답변1

사용 rsync:

rsync -a --include='*/' --include='*.txt' --exclude='*' source_dir/ target_dir

source_dir이렇게 하면 복사된 파일과 이름이 일치하는 파일이 target_dir포함된 디렉터리 계층의 복사본이 생성됩니다 .*.txt

--include옵션은 --exclude"wins"라는 이름과 일치하는 첫 번째 패턴을 사용하여 왼쪽에서 오른쪽으로 처리됩니다. 여기에서 이러한 옵션을 사용하면 모든 디렉터리와 일치하는 이름이 처리되지만 *.txt다른 모든 것은 무시됩니다.

-a( ) 옵션을 사용 --archive하면 source_dir계층 구조가 재귀적으로 처리되고 가능한 한 많은 파일 메타데이터가 복사본에 보존됩니다( rsync자세한 내용은 설명서 참조).

답변2

(절대) 대상 디렉터리가 있는지 확인하세요.

mkdir -p "$DST_DIR"

소스 디렉터리로 이동합니다($DST_DIR의 하위 디렉터리나 상위 디렉터리가 아니어야 함).

cd "$SRC_DIST"

디렉터리 구조를 다시 만듭니다(디렉터리 이름에 "\n"이 포함되어 있으면 실패함).

find . -type d -print | xargs -I% mkdir -p "$DST_DIR"/%

관심 있는 파일을 복사합니다(이 경우: *.txt 및 *.h).

find . \( -name \*.txt -o -name \*.h \) -print0 | cpio -pvdm0 "$DST_DIR"

사이드 노트

대상 파일이 포함되지 않은 디렉토리를 원하지 않으면 다음을 수행할 수 있습니다.

find . \( -name \*.txt -o -name \*.h \) -print0 \
| cpio -pvdm0 $DST_DIR

관련 정보