원격 서버(serverB)에서 로컬 서버(serverA)로 많은 수의 파일을 복사하려고 합니다. 내 시간 범위를 지정하기 위해 -newermt
옵션을 사용하고 있습니다 .find
원격 서버(serverB)에 10일간의 데이터만 보관하고 싶습니다. 다음 코드를 사용합니다.
a=10
b=9
x=$(date +%Y%m%d -d "$a days ago")
y=$(date +%Y%m%d -d "$b days ago")
echo $x
echo $y
#create a directory on local server
mkdir -p /fileData/fileBackup$x-$y
ssh dbadmin@ip find /fileData/Backup -maxdepth 1 -name "*" -type f -newermt $x -not -newermt $y -exec cp -pr {}\; /fileData/fileBackup$x-$y/
그러나 다음과 같은 출력이 표시되고 오류 메시지로 끝납니다.
20230512
20230513
find: paths must precede expression:
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
bash: /fileData/fileBackup20230512-20230513/: No such file or directory
답변1
ssh
인수와 공백의 연결을 해석하는 쉘을 실행하는 것을 기억하십시오 . *
로컬 및 원격 쉘 모두에 대해 인용 해야 하지만 -name '*'
사용자의 로케일에서 유효한 텍스트가 아닌 파일 이름을 제외하려는 경우가 아니면 별 의미가 없습니다(그러나 모든 디렉토리 구성 요소를 확인하려는 경우도 있습니다( 모든 구현에서 이 작업을 수행하는 것은 -path '*'
아닙니다 ). find
).
a=10
b=9
x=$(date -d "$a days ago" +%F)
y=$(date -d "$b days ago" +%F)
ssh dbadmin@ip "
mkdir -p /fileData/fileBackup$x-$y &&
find /fileData/Backup \
-maxdepth 1 \
-type f \
-newermt $x \
! -newermt $y \
-exec cp -pt /fileData/fileBackup$x-$y {} +
"
반품:
-r
일반 파일에는 적합하지 않습니다.- GNU의 경우 (그리고 이미 많은 GNUism을 사용하고 있음) 지정된 대상을
cp
사용할 수 있습니다 . 이를 통해 인수 순서를 바꾸지 않고도 여러 인수를 전달할 수 있습니다.-t dest
cp
sh
%F
표준 형식이기 때문에 YYYYMMDD 대신 YYYY-MM-DD 형식(그림 참조)을 사용하겠습니다 .- 여기에서 대안 으로 다음
-mtime
과의 조합을 참조하세요 .-daystart
-newermt
- POSIX 표준에서 요구하는 방식이기 때문에
-d spec
옵션(예: )보다 먼저 옵션(예: )을 전달하는 습관을 들이는 것이 좋습니다. GNU 유틸리티에서도 일반적으로 옵션이 아닌(예: ) 뒤에 옵션이 전달되도록 허용합니다.+%F
다음과 같은 경우에는$POSIXLY_CORRECT
환경에 없습니다. 이것은 결코-d
표준 옵션이 아닙니다date
. cp
이(가) 원격 컴퓨터에서 실행 중이므로 파일을 복사할 수 없습니다.현지의기계. 이렇게 하려면 원격 호스트에서pax
libarchivebsdtar
또는 GNU를 사용하여 파일과 해당 메타데이터의 직렬화를 보내고tar
로컬에서 추출해야 합니다.
a=10
b=9
x=$(date -d "$a days ago" +%F)
y=$(date -d "$b days ago" +%F)
mkdir -p /fileData/fileBackup$x-$y &&
ssh dbadmin@ip "
find /fileData/Backup \
-maxdepth 1 \
-type f \
-newermt $x \
! -newermt $y \
-print0 |
bsdtar --format pax --null -cT - -f- |
gzip -1
" | bsdtar -C "/fileData/fileBackup$x-$y" -xpf - -'s:.*/::'
gzip -1
여기에서는 대역폭을 절약하기 위해 압축된 스트림이 사용됩니다 . 낮은 대역폭 링크를 사용하고 있다면 속도가 느리더라도 압축률이 더 높은 것을 사용하고 싶을 수도 있습니다. 고대역폭 링크를 사용하고 있다면 압축률이 좋지 않더라도 압축 속도가 더 빨라집니다. gzip
어느 면에서든 좋지는 않지만 거의 모든 곳에 있다는 장점이 있습니다.
적어도 GNU의 경우 이는 시스템이 문자열을 파일 이름 패턴과 일치시키는 데 사용하는 기능 find
에 따라 다릅니다 .fnmatch()
답변2
이는 발견된 파일을 로컬 시스템(마지막 줄의 내용) 대신 원격 시스템의 "/fileData/fileBackup$x-$y/" 디렉토리에 복사하려고 하기 때문이며 오류는 다음과 같습니다. 원격 시스템이 있습니다. 에 그러한 디렉토리가 없습니다. 아마도 scp를 사용하여 원격 시스템에서 로컬 시스템으로 발견된 파일을 복사할 수 있습니다. 행운을 빌어요.