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はリモートコンピュータで実行されているため、ファイルをコピーできません。地元のマシン。これを行うには、リモートホストからpaxlibarchivebsdtarまたは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()

おすすめ記事