web-dev-qa-db-ja.com

特定の日の間にあるファイルをscp / tarする方法は?

10.3.2013-13.3.2013の間でのみファイルに関心がある2つのsuseサーバー間でdbログファイルをコピーする必要があります

コピーする前にファイルを圧縮して、tarとscpで圧縮することが望まれます。現在、tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10を使用しています。これにより、2013年10月3日から現在までのすべてのファイルを取得できます。しかし、私はそれらすべてを必要としません。そして、tarスイッチは見つかりませんでした。

8
Radek

Bichoyが示したように、findコマンドを使用して、特定のアクセス、作成、および変更時刻を持つファイルを検索できます。ただし、-mtimeは24時間単位でオフセットを取得し、特定の「日」前の数から何かが必要でない限り、計算するのに必ずしも便利ではありません。それを-daystartと組み合わせて、その日の初めに「丸める」必要があります。

私はあなたのケースでより便利だと思います-datestringをとる-newermtオプションです(そしてほとんどの-newerXYバージョンのような参照ファイルの名前ではありません)

これをfind-print0オプションと組み合わせて、名前にスペースが含まれるファイルを処理し、オプションで-type fを使用して、関心のある期間にディレクトリを取得しないようにします。

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | xargs -0 tar -cvzf /tmp/saas_archive_logs.tar.gz 

これには大きな問題が1つあります。検出されたファイルの数が長くなる場合、xargstarの必要に応じてそのコマンド(この場合はxargs)を複数回呼び出します無限ではないコマンドラインの引数に合わせるため。それを回避するには、常にcpioを使用します。これは、stdinからファイル名を読み取ります。 --format=ustarパラメータを使用してPOSIX tarファイルを取得します。この場合、目的の結果を取得するには、出力をgzipにパイプする必要があります。

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | cpio --create --null  --format=ustar \
   | gzip > /tmp/saas_archive_logs.tar.gz
12
Anthon

findコマンドをチェックして、風袋引きする必要のあるファイルのリストを取得できます。 -atime引数と組み合わせて通常の-btime-mtime-not ...引数を使用して、開始日と終了日(最大秒精度)を指定できます。次に、出力をxargsにパイプし、次にtarにパイプできます。時間引数の詳細については、findのmanページを確認してください。

pdate: Anthonが示唆したように、-mtimeで+/-修飾子を使用して、-notを使用せずに期間を指定できます。次に例を示します。

find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2

ここで、d, h, m, sはそれぞれ日、時間、分およびに対応します。これにより、5d2h3m10sより新しく、4d0h15m20sより古いファイルが変更されます。

4
Bichoy