newermt 옵션을 사용하여 원격 서버에서 파일을 찾기 위한 변수를 전달합니다.

newermt 옵션을 사용하여 원격 서버에서 파일을 찾기 위한 변수를 전달합니다.

원격 서버(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 destcpsh
  • %F표준 형식이기 때문에 YYYYMMDD 대신 YYYY-MM-DD 형식(그림 참조)을 사용하겠습니다 .
  • 여기에서 대안 으로 다음 -mtime과의 조합을 참조하세요 .-daystart-newermt
  • POSIX 표준에서 요구하는 방식이기 때문에 -d spec옵션(예: )보다 먼저 옵션(예: )을 전달하는 습관을 들이는 것이 좋습니다. GNU 유틸리티에서도 일반적으로 옵션이 아닌(예: ) 뒤에 옵션이 전달되도록 허용합니다. +%F다음과 같은 경우에는 $POSIXLY_CORRECT환경에 없습니다. 이것은 결코 -d표준 옵션이 아닙니다 date.
  • cp이(가) 원격 컴퓨터에서 실행 중이므로 파일을 복사할 수 없습니다.현지의기계. 이렇게 하려면 원격 호스트에서 paxlibarchive bsdtar또는 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를 사용하여 원격 시스템에서 로컬 시스템으로 발견된 파일을 복사할 수 있습니다. 행운을 빌어요.

관련 정보