**
- 질문 1:
** 전제조건: 원본과 대상의 디렉터리 이름이 동일해야 합니다. 이름이 아니라 디렉토리의 깊이 수준이 다를 수 있습니다.
소스 및 대상 구조에 대한 참고 사항:
- SampleFolder 및 Project1은 경로의 유일한 공통 부분입니다.
- 복사해야 할 디렉터리가 여러 개 있습니다.
- 디렉터리는 동일한 경로에 있는 대신 한 수준 깊이, 두 수준 깊이일 수 있으므로 기본적으로 파일을 복사하기 전에 참조 폴더를 검색해야 합니다.
mydir
|__ sampleFolder/fil.txt
|__ Project1/fil2.txt
desDir
|__ some_path/More_path/sampleFolder/
|__ some_path/More_path/some_more_path/Project1/
목적: 폴더의 파일을 mydir/sampleFolder/file.txt
다음 위치로 복사합니다.desDir/some_path/sampleFolder/file.txt
참고: 원본 경로와 대상 경로의 경로 계층 구조는 다르지만 sampleFolder
동일합니다.
주문하다
find $HOME/mydir/ -type f -name *.txt -exec sh -c 'cp {}' 'find $HOME/des_dir -type d -path `echo $(dirname -- {}) | sed s"~$HOME/mydir~~g"`' sh {} \;
명령 분석 1: 상위 디렉터리를 가져와 $HOME/mydir
검색된 *.txt
파일 경로 에서 제거합니다.
echo $(dirname -- {}) | sed s"~$HOME/mydir~~g"
명령 분해 2: 명령 분해 1을 실행한 후 수신된 문자열과 일치하는 경로를 검색합니다.
find $HOME/des_dir -type d -path
명령 분석 3: 이것은 매우 일반적인 것입니다(아마도)
find $HOME/mydir/ -type f -name *.txt -exec sh -c 'cp {}'
**
- 질문 2
** 아래 명령을 사용하여 문제 1을 해결했습니다. cygwin에서 독립 실행형 명령으로 실행하면 정상적으로 작동합니다.
find $HOME/MY_DIR/ -type d -name data -exec sh -c 'rsync -avz {} `find $HOME/DES_DIR-type d -name $(basename $(dirname -- {}))`' sh {} \;
하지만 이 명령을 쉘 스크립트에서 사용하고 cygwin에서 스크립트를 실행하면 오류가 발생합니다.
protocol version mismatch - is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(60)
답변1
하려는 작업은 다소 모호하지만 rsync
전체 디렉터리를 복사할 계획이라면 적합할 수 있습니다.
예를 들어
$ rsync -avz level2 level3/test/
sending incremental file list
level2/
level2/out.txt
level2/rds.aws.test.lambda.json
sent 380 bytes received 58 bytes 876.00 bytes/sec
total size is 341 speedup is 0.78
$ ls level3/test/
level2
$ ls level3/test/level2/
out.txt rds.aws.test.lambda.json
*.txt 파일만 필요하고 디렉터리 구조를 유지하는 경우 R
rsync에 옵션을 추가 해야 합니다.
$ rsync -avzR level2/*.txt level3/test2
sending incremental file list
level2/
level2/out.txt
sent 178 bytes received 39 bytes 434.00 bytes/sec
total size is 65 speedup is 0.30
$ ls level3/test2/level2/
out.txt