Shell Script - Ubah semua file setelah <date>

136

Saya lebih suka tidak melakukan ini di PHP jadi saya berharap seseorang yang ahli dalam skrip shell dapat membantu.

Saya memerlukan skrip yang berjalan melalui direktori secara rekursif dan menemukan semua file dengan tanggal modifikasi terakhir lebih besar dari tanggal tertentu. Kemudian, itu akan mem-tar dan zip file (s) menyimpan informasi jalur.

Jonathan Leffler
sumber
14
Keputusan bagus untuk tidak melakukannya di PHP.
Kredns
1
Anda dapat menggunakan salah satu bahasa skrip shell yang layak, misalnya python, ruby, perl tanpa menggunakan php.
garrow
3
@garrow Ini sebenarnya akan cukup sederhana dalam PHP menggunakan RecursiveDirctoryIterator yang dikemas dalam FilterIterator.
Artefacto

Jawaban:

137

sesederhana:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

di mana find . -mtime -1akan memilih semua file dalam (secara rekursif) direktori saat ini diubah hari sebelumnya. Anda dapat menggunakan pecahan, misalnya:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
skrat
sumber
4
Lihat jawaban pengguna104848 di bawah untuk cara menangani spasi dalam nama file Anda
Brian Henk
8
Mengubah stempel waktu sewenang-wenang menjadi pecahan, jumlah waktu relatif tampaknya tidak benar atau sangat nyaman. Solusi di bawah ini menggunakan -newermtadalah jauh lebih bagus.
Bobby Jack
5
Saat mencoba mengekstrak file apa pun dengan perubahan dalam struktur dengan direktori, direktori itu sendiri ditandai diubah menyebabkan seluruh folder diarsipkan. Tambahkan -type fke file tertentu saja. Ini mempertahankan struktur folder, tetapi hanya mencadangkan file dengan perubahan.
Brent
1
@BrianHenk pengguna104848 mengubah nama mereka, saya cukup yakin yang Anda maksud jawaban ini dari (saat ini) Jason Luther meskipun
icc97
4
Pertanyaannya meminta untuk menemukan file berdasarkan tanggal sewenang-wenang. Jawaban ini adalah bagaimana menemukan file berdasarkan jumlah hari yang berubah-ubah di masa lalu. Saya tidak berpikir ini harus menjadi jawaban yang diterima tanpa menambahkan langkah untuk mengubah tanggal menjadi delta hari.
Tandai
94

Jika Anda memiliki GNU find, maka ada banyak sekali opsi yang relevan. Satu-satunya hambatan adalah bahwa antarmuka mereka kurang dari bintang:

  • -mmin n (waktu modifikasi dalam menit)
  • -mtime n (waktu modifikasi dalam beberapa hari)
  • -newer file (waktu modifikasi lebih baru dari waktu modifikasi file)
  • -daystart (sesuaikan waktu mulai dari waktu sekarang hingga awal hari)
  • Ditambah alternatif untuk waktu akses dan 'ubah' atau 'buat' waktu.

Bagian tersulitnya adalah menentukan jumlah menit sejak suatu waktu.

Satu opsi yang patut dipertimbangkan: gunakan touchuntuk membuat file dengan cap waktu modifikasi yang diperlukan; lalu gunakan finddengan -newer.

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

Ini mencari file yang lebih baru dari 2009-01-03T12: 31: 43. Jelas, dalam sebuah skrip, /tmp/wotsitakan ada nama dengan PID atau nilai lain untuk membuatnya unik; dan akan ada trapuntuk memastikan itu dihapus bahkan jika pengguna menyela, dan seterusnya dan sebagainya.

Jonathan Leffler
sumber
68
Sebagai gantinya, Anda dapat menggunakan -newermt '2009-01-03T12:31:43'untuk menghindari kebutuhan membuat file hanya untuk referensi.
Michael Mior
@MichaelMior: Menarik - 'temukan' di MacOS X 10.7.2 mendukung -newermt(didokumentasikan di bawah -newerXYkarena ada beberapa opsi; X = m, Y = t dalam kasus ini). GNU yang ditemukan pada sistem Linux (hampir kuno) yang saya gunakan tidak mendukung opsi, jadi ini adalah kedatangan yang relatif baru. Terimakasih atas peringatannya.
Jonathan Leffler
Opsi ini ada di GNU find 4.4.2 yang saya gunakan di sistem saya.
Michael Mior
2
Perhatikan juga bahwa GNU find juga mendukung waktu relatif, yaitu. -newermt '-2 weeks'.
Cybolic
1
-newermt '2009-01-03T12:31:43'terlihat luar biasa, tetapi sayangnya tampaknya menafsirkan semuanya di zona waktu yang salah: lists.gnu.org/archive/html/bug-findutils/2012-12/msg00009.html
antoine
35

Anda dapat melakukan ini secara langsung dengan tar dan bahkan lebih baik:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

Ini menginstruksikan tar untuk mengompres file yang lebih baru dari tanggal 1 Januari 2014, 18:00:00.

satu baris
sumber
9
Huh ... Saya telah menggunakan Unix sejak 1984 dan tidak pernah tahu ini. Selalu sesuatu untuk dipelajari.
Yohanes
Implementasinya tardatang hanya dengan dukungan OS X dan FreeBSD --neweryang merupakan opsi panjang untuk -NGNU tar.
nisetama
Ini luar biasa ... Saya hanya bisa membuatnya bekerja dengan bzip, tidak menggunakan -xcvf dan ekstensi gz ... tapi saya bukan ahli.
phil
17

Ini akan berfungsi untuk beberapa file. Anda ingin menyertakan "-print0" dan "xargs -0" jika ada jalur yang memiliki spasi di dalamnya. Contoh ini mencari file yang diubah dalam 7 hari terakhir. Untuk menemukan yang diubah sebelum 7 hari terakhir, gunakan "+7".

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

Seperti yang diperingatkan halaman ini , xargs dapat menyebabkan perintah tar dijalankan beberapa kali jika ada banyak argumen, dan tanda "-c" dapat menyebabkan masalah. Dalam hal ini, Anda menginginkan ini:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

Anda tidak dapat memperbarui arsip tar yang di-zip dengan tar, jadi Anda harus melakukan bzip2 atau melakukan gzip di langkah kedua.

Jason Luther
sumber
1
Mengenai poin kedua, Anda dapat menggunakan perintah tar yang mendukung gzip, seperti opsi -z Gnu tar, untuk memperbarui arsip zip juga.
Suncat2000
Atau tambahkan opsi 'j' untuk menggunakan bzip di GNU tars terbaru
hd1
3
Seperti yang saya katakan di atas pada jawaban Jonathan, ini akan mengambil folder yang memiliki perubahan yang menyebabkan semua file mereka diimpor. Tambahkan -type fke file tertentu saja. Ini mempertahankan struktur folder, tetapi hanya mencadangkan file dengan perubahan / ditambahkan baru-baru ini.
Brent
12

Ini akan menampilkan semua file yang diubah dalam 7 hari terakhir.

find . -type f -mtime -7 -print

Masukkan itu ke dalam tar / zip, dan Anda akan melakukannya dengan baik.

Chris Doggett
sumber
4

Saya hanya akan melakukan hal berikut untuk membuat cadangan semua file baru dari 7 hari yang lalu

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

perhatikan Anda juga bisa mengganti '7 hari yang lalu' dengan apapun yang sesuai dengan kebutuhan Anda

Dapat : date -d'yesterday' +"%d-%b"

Atau bahkan : date -d'first Sunday last month' +"%d-%b"

Michel
sumber
3

baik di bawah linux coba baca halaman manual dari perintah find

man find

sesuatu seperti ini seharusnya

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

dan Anda memilikinya

Luixv
sumber
3

Anda bisa mendapatkan daftar file yang terakhir diubah lebih dari x hari yang lalu dengan:

find . -mtime -x

Kemudian Anda hanya perlu file tar dan zip dalam daftar yang dihasilkan, misalnya:

tar czvf mytarfile.tgz `find . -mtime -30`

untuk semua file yang diubah selama sebulan terakhir.

mouviciel
sumber
3
"-mtime x" cocok dengan file yang diubah persis dengan "x" hari yang lalu, gunakan "-mtime -x" untuk mencocokkan file yang diubah kurang dari "x" hari yang lalu.
Lance Richards
2

Skrip ini akan menemukan file yang memiliki tanggal modifikasi dua menit sebelum dan sesudah tanggal yang ditentukan (dan Anda dapat mengubah nilai dalam kondisi sesuai kebutuhan Anda)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

Misalnya Anda ingin file memiliki tanggal modifikasi sebelum tanggal tertentu saja, Anda dapat mengubah 120ke 0dalam $DIFF_IN_DATEparameter membuang kondisi $DIFF_IN_DATE1parameter.

Demikian pula jika Anda ingin file memiliki tanggal modifikasi 1 jam sebelum dan setelah tanggal tertentu, ganti saja 120 dengan 3600in if CONDITION.

Zeeshan Ali
sumber