내 디렉토리 구조는 다음과 같습니다.
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
앞에 있는 및 명령을 삭제하세요.mkdir
cp
답변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를 건너뛰어야 하는 항목으로 설정할 수 있습니다.