Bagaimana cara scp / tar file yang ada di antara hari-hari tertentu?

8

Saya perlu menyalin file log db antara dua server suse di mana saya hanya tertarik pada file antara 10.3.2013 - 13.3.2013

Diinginkan untuk mengkompres file sebelum menyalin jadi saya tar mereka dan scp. Saat ini saya menggunakan tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10yang memberi saya semua file dari 10.3.2013 sampai sekarang. Tetapi saya tidak membutuhkan semuanya. Dan saya tidak menemukan saklar tar.

Radek
sumber

Jawaban:

12

Seperti yang ditunjukkan Bichoy, Anda dapat menggunakan findperintah untuk menemukan file dengan akses, waktu pembuatan, dan modifikasi tertentu. Namun - waktu mengambil offset dalam kenaikan 24 jam dan tidak selalu nyaman untuk dihitung kecuali jika Anda menginginkan sesuatu dari jumlah tertentu jumlah 'hari' yang lalu. Anda harus menggabungkannya dengan -daystartuntuk 'memutari' itu ke awal hari.

Saya pikir lebih nyaman dalam kasus Anda, adalah opsi -newermt yang mengambil datestring (dan bukan nama file referensi seperti kebanyakan versi -newerXY)

Menggabungkan dengan find's -print0pilihan untuk file handle dengan spasi dalam nama dan opsional -type funtuk tidak mendapatkan direktori pada periode Anda tertarik:

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 

Ada satu masalah besar dengan itu: jika jumlah file yang ditemukan menjadi panjang, xargsakan memanggil perintahnya (dalam hal ini tar) beberapa kali karena xargsharus sesuai dengan argumen pada commandline yang tidak terbatas. Untuk menghindari itu saya selalu menggunakan cpio, yang bertuliskan nama file dari stdin. Dengan --format=ustarparameter untuk mendapatkan file tar POSIX, dan dalam kasus Anda, Anda perlu menyalurkan output gzipuntuk mendapatkan hasil yang diinginkan:

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
Anthon
sumber
Bisakah saya menentukan jam dan menit saat menggunakan kode Anda?
Radek
Saya mencoba sebelum memposting komentar saya tetapi ... "menemukan: Saya tidak tahu bagaimana menafsirkan` 201302050000 'sebagai tanggal atau waktu "
Radek
@ Radek Jawaban singkatnya adalah Ya. Saya akan menggunakan YYYYMMDDThhmm agar tidak harus berurusan dengan spasi. Jawaban panjangnya: man find akan memberi tahu Anda: Spesifikasi waktu diartikan sebagai argumen untuk opsi -d dari tanggal GNU dan dengan man date Anda akan menemukan... a mostly free format human readable date string ..... A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers
Anthon
@Radek terima kasih telah menunjukkan kesalahannya, karena saya tidak dapat mengedit komentar saya, saya memasukkan kembali yang baru dengan Tmemasukkan antara Hari dan Jam. Itu saya uji dan bekerja. Entah bagaimana findtidak tahu cara membagi string sebaliknya (mungkin karena itu bisa YYMMDDhhmmss bukan YYYYMMDDhhmm. Saya pikir tanggal akan memerlukan titik untuk detik ( .ss) tetapi itu mungkin hanya untuk mengatur tanggal.
Anthon
4

Anda dapat memeriksa findperintah untuk mendapatkan daftar file yang perlu dijinakkan. Anda dapat menentukan tanggal awal dan akhir (sampai detik presisi) menggunakan normal -atime, -btime, -mtime... argumen dalam kombinasi dengan -notargumen. Anda kemudian dapat menyalurkan output ke xargsdan kemudian ke tar. Periksa halaman manual finduntuk detail tentang argumen waktu.

Pembaruan: Seperti yang disarankan Anthon, Anda dapat menggunakan pengubah +/- dengan -mtimeuntuk menentukan periode tanpa menggunakan -not. Berikut ini sebuah contoh:

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

Dimana masing-masing d, h, m, ssesuai dengan hari, jam, menit dan detik . Ini akan memberikan file yang dimodifikasi lebih baru 5d2h3m10sdan lebih lama dari4d0h15m20s

Bichoy
sumber
2
argumen -mtimeharus offset dalam hari yang tidak selalu kecuali Anda yang offset diperbaiki antara waktu berjalan. Anda juga dapat menggunakan -mtime +Xdan -mtime -Xmenentukan sebelum dan sesudah X hari yang lalu alih-alih menggunakan -not.
Anthon
Apa yang akan menjadi sintaks untuk menentukan tanggal & waktu absolut?
Radek