Jika Anda mengekstrak file sedemikian rupa sehingga stempel waktu modifikasi dalam arsip tidak disimpan dalam salinan yang diekstrak (melainkan file yang diekstrak memiliki waktu modifikasi seperti biasanya) maka cara yang tepat untuk menyerang ini adalah melalui waktu modifikasi. Semua file yang diekstraksi memiliki stempel waktu modifikasi yang lebih baru daripada file yang ada yang paling baru dimodifikasi dalam direktori itu.
Ini situasi sederhana.
Misalkan tidak ada file yang ada di direktori saat ini disentuh selama setidaknya 24 jam. Karena itu, apa pun yang dimodifikasi dalam 24 jam terakhir adalah sampah dari zipfile.
$ find . -mtime -1 -print0 | xargs -0 rm
Ini akan menemukan beberapa direktori juga, tetapi rm
akan membiarkannya sendirian. Mereka dapat ditangani di babak kedua:
$ find . -mtime 1 -type d -print 0 | xargs -0 rmdir
Setiap direktori yang baru-baru ini dimodifikasi dimodifikasi oleh zip. Jika rmdir
berhasil menghapusnya, itu berarti mereka kosong. Direktori kosong yang disentuh oleh zip mungkin dibuat olehnya: yaitu berasal dari arsip. Kami tidak bisa 100% yakin. Mungkin saja pekerjaan unzip memasukkan beberapa file ke direktori yang ada yang kosong.
Jika find
granularity 24 jam tidak cukup baik untuk pekerjaan itu, karena file dalam pohon dimodifikasi terlalu baru, maka saya selanjutnya akan mempertimbangkan sesuatu yang sederhana: misalkan pekerjaan unzip tidak memasukkan apa pun ke subdirektori yang ada. Dengan kata lain, semua yang tidak di-zip adalah file di tingkat atas, atau subdirektori baru yang tidak ada sebelumnya, yang karenanya tidak berisi apa pun selain materi dari zip. Kemudian:
# list directory in descending order of modification time
$ ls -1t > filelist # descending order of modification time
Sekarang kita buka filelist
di editor teks, dan tentukan entri pertama dalam daftar yang tidak berasal dari zip. Kami menghapus entri itu dan yang lainnya setelahnya. Yang tersisa adalah file dan direktori yang berasal dari zip. Pertama-tama kita secara visual memeriksa masalah-masalah seperti spasi dalam nama, dan kemunculan kutipan yang perlu diloloskan. Kami kemudian dapat menambahkan kutipan di sekitar segalanya, jika perlu: Berikut ini diasumsikan Anda menggunakan Vim:
:%s/.*/"&"/
Kemudian gabungkan semuanya menjadi garis besar:
:%j
Sekarang masukkan rm -rf
di depannya:
Irm - rf<ESC>
Jalankan baris di bawah kursor sebagai perintah shell:
!!sh<Enter>
Jelas, saya tidak akan mengotomatiskan langkah-langkah tugas ini, karena risiko menghapus file yang sudah ada di sana, atau mengacaukan karena masalah nama file.
Jika Anda akan pergi rute yang jelas untuk mendapatkan daftar jalur di zip, lalu tangkap ke file, lihat dengan sangat hati-hati dan mengubahnya menjadi penghapusan setelah melakukan pengeditan yang diperlukan.
lq
opsi untukunzizp
, saya hanya menambahkan beberapa trik * nix klasik di sekitar jawaban utamanya.