디렉터리의 모든 파일을 복사하지만 하위 디렉터리의 특정 파일은 복사하지 않습니다.

디렉터리의 모든 파일을 복사하지만 하위 디렉터리의 특정 파일은 복사하지 않습니다.

내 디렉토리 구조는 다음과 같습니다.

source-dir---
            |----- file-1
            |----- file-2
            |----- file-3
            |----- folder-1
                      |---- file-4
                      |---- file-5

소스 디렉터리의 모든 파일을 대상 디렉터리로 복사하고 동일한 폴더 구조를 유지하고 싶지만 file-5하위 디렉터리에서는 복사하지 않으려고 합니다.

예상되는 대상 디렉터리는 다음과 같습니다.

destination-dir---
                 |----- file-1
                 |----- file-2
                 |----- file-3
                 |----- folder-1
                           |---- file-4

cp명령 자체를 사용하여 위의 동작을 달성할 수 있습니까 ? 아니면 사용할 rsync특정 정규식 명령이 있나요?find

답변1

이렇게 하면 작동합니다. 제외하면 됩니다.file-5하위 디렉터리의 모든 수준에서 복사source디렉터리이지만 최상위 수준에 존재하는 경우에는 그렇지 않습니다.

cd /path/to/source
find . ! -path './*/file-5' -type d,f -exec sh -c '
    [ -d "$1" ] && echo mkdir -vp "/path/to/dest/$1" || echo cp -v "$1" "/path/to/dest/$1"
' sh_cp {} \;

특정 하위 디렉터리에서만 특정 파일을 제외하려면 ./folder-1/file-5해당 디렉터리에서만 해당 파일을 제외하는 것처럼 엄격하게 언급하세요.

테스트 실행 결과에 만족한다면 echo앞에 있는 및 명령을 삭제하세요.mkdircp

답변2

내가 올바르게 이해했다면 특정 디렉터리(folder-1)에서 특정 파일(file-5)을 복사하는 것을 건너뛰고 싶다면 다음과 같이 rsync에 해당 파일을 제외하도록 지시할 수 있습니다.

$ rsync -avz -f'- folder-1/file-5' ~/source/ ~/destination/

답변3

이 질문은 때려야겠다는 생각을 하게 만든다와일드카드

다음은 설명 주석이 포함된 작은 스크립트입니다.

#!/bin/bash

# Check that the arguments are two.
# Source and destination
[ ${#@} -eq 2 ] || exit 1

# Remove, a possible, traling backslash
src="${1%/}"
dst="${2%/}"

# Enalble needed option for gloobin
shopt -q extglob || shopt -s extglob
shopt -q globstar || shopt -s globstar

# Set here the name to ignore
GLOBIGNORE="$src"/*/file-5

for e in "$src"/**; do
    # Skip the base directory
    [ "$e" != "$src/" ] || continue

    # If we process a directory then create it
    # in the destionation
    [ -d "$e" ] && echo mkdir "$dst/$e" && continue

    # Plain file, do then copy
    [ -f "$e" ] && echo cp "$e" "$dst/"
done

예를 들어 스크립트 이름을 바꾸고 sample.sh다음과 같이 호출합니다 .sample.sh src_path dst_path

만족스러우면 제거하세요 echo. 물론 GLOBIGNORE를 건너뛰어야 하는 항목으로 설정할 수 있습니다.

관련 정보