그 안에 많은 하위 폴더가 있는 디렉토리가 있고 하위 폴더 아래에 다른 하위 폴더가 있습니다. 모든 디렉터리와 하위 디렉터리를 다른 위치에 복사하고 계층 구조를 유지하면서 이 디렉터리에 특정 이름을 가진 파일만 복사하고 싶습니다.
모든 디렉터리와 하위 디렉터리가 복사되었다고 가정하면, 해당 디렉터리에 확장자를 가진 파일이 있으면 .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