Temukan file yang lebih baru dari sehari dan salin


12

Saya sedang mengerjakan skrip yang akan menyalin HANYA file yang telah dibuat dalam hari terakhir ke folder lain. Masalah yang saya alami adalah skrip yang saya miliki menyalin semua file dalam direktori sumber, bukan hanya file yang berumur kurang dari satu hari.

Inilah yang saya miliki:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

Kode di atas menyalin semua file di direktori sumber. Jika saya menghapus semua argumen untuk 'cp' maka itu berfungsi:

find . -mtime -1 -exec cp "{}" /somefolder \;

Kode di atas hanya menyalin file-file terbaru seperti yang saya inginkan tetapi saya perlu mempertahankan atribut menggunakan argumen cp.

Saya juga telah mencoba variabel dan untuk loop berpikir mungkin opsi -exec adalah masalahnya:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Namun, hasil loop di atas dalam masalah yang sama, semua file disalin. Jika saya echo $ file hanya file yang saya perlukan yang ditampilkan.

Bagaimana saya bisa membuatnya bekerja?


1
Ok saya pikir saya sudah menggunakannya menggunakan:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234

Bukankah rsync menjadi alat yang lebih baik untuk tugas ini daripada cp? rsync -sebuah tujuan sumber
Darryl

Jawaban:


9

Beberapa implementasi cpmemiliki -topsi, sehingga Anda dapat meletakkan direktori target sebelum file:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Catatan yang -amenyiratkan --preservejadi saya menghapus yang terakhir.


3

Anda dapat menggunakan paxini seperti:

pax -wrT "11$(date +%H%M)," . /destination/folder

Baris perintah sedikit demi sedikit:

  • -wr- Ketika paxdiserahkan baik -writus dan -ropsi ead itu salinan. Mungkin juga bermanfaat disini. (tetapi tidak termasuk dalam perintah di atas)

    • -ltinta - yang menciptakan hard-link jika memungkinkan daripada menyalin file-data.

    • -Xuntuk membatasi paxke perangkat sumber yang sama dan / atau sistem file.

    • -s/src regex/replace/ - yang mengubah nama file dalam-aliran

    • -verbose - untuk melaporkan file yang bersumber / ditargetkan.

  • -T- -Topsi ime memilih file untuk arsip target (atau hanya untuk disalin ketika digunakan -wr) berdasarkan waktu /modifikasi atau inode /change (atau keduanya) . Ini default ke waktu mod. Dari...

pax pria

  • ... Perbandingan waktu menggunakan kedua waktu file berguna ketika pax digunakan untuk membuat arsip inkremental berdasarkan waktu (hanya file yang diubah selama rentang waktu yang ditentukan yang akan diarsipkan).

  • Rentang waktu terdiri dari enam bidang berbeda dan setiap bidang harus berisi dua digit. Formatnya adalah:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Di mana ccdua digit pertama tahun (abad), yyadalah dua digit terakhir tahun ini, yang pertama mmadalah bulan (dari 01 hingga 12), ddadalah hari dalam sebulan (dari 01 hingga 31), HHadalah jam hari (dari 00 hingga 23), MMadalah menit (dari 00 hingga 59), dan SSmerupakan detik (dari 00 hingga 59). Bidang menit MMdiperlukan, sedangkan bidang lainnya opsional dan harus ditambahkan dalam urutan berikut:

    HH, dd, mm, yy, cc

  • The SSlapangan dapat ditambahkan secara independen dari bidang lainnya. Rentang waktu relatif terhadap waktu saat ini, jadi ...

    -T 1234/cm

  • ... akan memilih semua file dengan modifikasi atau perubahan waktu inode pukul 12:34 hari ini atau nanti.

  • Berbagai -Trentang waktu dapat diberikan dan memeriksa berhenti dengan pertandingan pertama.

... jadi perintah yang 11ada di atas dalam contoh saya relatif terhadap hari ini - ini adalah salah satu yang kurang dari tanggal hari ini - yang merupakan tanggal dua belas - dan sisanya hanya "$(date)"format standar diikuti dengan koma.

... kecuali - dan hal terakhir yang layak disebut - saya menggunakan jalur absolut untuk direktori target - dan Anda juga harus melakukannya jika melakukannya. Dokumen semua referensi perilaku yang tidak ditentukan untuk jalur target relatif - dan pertama kali saya mencoba menggunakan paxsaya bersumpah selama satu jam dalam kebingungan dengan semua hasil aneh sampai saya menggunakan jalur absolut.


2

Terima kasih semua orang atas bantuannya, buat itu berfungsi menggunakan kombinasi saran Anda:

pergi dengan kode di bawah ini dan berfungsi dengan baik.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

Terima kasih lagi!


2

Saya melakukan fungsi yang persis sama tetapi perlu untuk mempertahankan struktur folder. Karenanya apa yang telah saya lakukan sedikit berbeda.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

di mana $ days adalah jumlah hari $ tarpath adalah jalur sementara untuk menyimpan file-file ini. dan ketika saya ingin mengembalikan.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Itu telah melakukan trik untuk saya.

Catatan: jika Anda ingin mengecualikan beberapa folder saat mengambil cadangan Anda dapat menggunakan perintah berikut

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Keuntungan: 1. Saya selalu memiliki salinan dari apa yang saya kembalikan terakhir kali dalam format terkompresi.

  1. Saya juga memiliki jeda di antara pemulihan di mana saya bisa pergi dan memeriksa apa file-file itu dan jika semua baik-baik saja maka lanjutkan dengan skrip.

  2. Ini mempertahankan struktur folder karenanya hanya menimpa file yang dimodifikasi dari direktori sumber ke direktori tujuan

Catatan: Di sisi lain jika persyaratannya tidak terbatas hari saya akan menggunakan rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

lebih banyak untuk rsyc dengan tanggal di sini


1

Satu juga dapat memilih tanggal dan waktu yang tepat selain kembali ke jumlah hari tertentu

(Ini berfungsi baik hanya jika nama file Anda tidak memiliki spasi, tab atau wildcard di dalamnya)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Di atas menyalin semua file dalam direktori yang dibuat setelah 17 Desember 2016 20:10:00 ke FOLDER (1 hari sebelum hari ini :)

Hati-hati dengan simbol untuk perintah find, BUKAN ini: 'inilah ini, sebuah backtick: `pilihan tanggal adalah dengan ini:'

Untuk file dengan spasi, tab, baris baru, atau wildcard di namanya, Anda dapat menggunakan salah satu solusi dari Stéphane Chazelas, pertama untuk GNU, kedua untuk GNU atau beberapa BSD:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


Terima kasih Stephane, mungkin itulah sebabnya saya tidak dapat menemukan ini di pos mana pun, meskipun untuk kasus saya itu berfungsi seperti pesona. ketika Anda melakukan ini hanya temukan. -type f -newermt '17 des 2016 20:10:00 '
FatihSarigol

... itu mencetak file yang dibuat setelah waktu itu, saya tidak yakin masalah apa yang mungkin terjadi. maka saya hanya menggunakan backticks untuk memilih file-file ini untuk disalin. sorak-sorai
FatihSarigol

Saya yakin pos yang Anda bagikan adalah tentang "Looping over", apakah kode saya mengulangi hasil find? atau hanya memilih hasil temuan yang akan digunakan oleh copy? (Maaf untuk 3 komentar, saya tampaknya belum diperbolehkan mengedit komentar saya
FatihSarigol

1
Gunakan find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) atau find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU atau beberapa BSD (faktor pembatas portabilitas adalah -newermtpredikat di sini)).
Stéphane Chazelas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.