リモートサーバー(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()