Saya mengekstrak file zip ke folder yang tidak kosong. File zip memiliki banyak file dan hierarki yang dalam, yang digabung dengan pohon yang ada dari direktori target. Bagaimana saya bisa menghapus file dan direktori yang dibuat dengan membuka ritsleting tanpa merusak file dan direktori yang sudah ada di sana? Tentu saja, saya masih memiliki file zip yang saya gabungkan, jadi informasinya ada di sana.
52
lq
opsi untukunzizp
, saya hanya menambahkan beberapa trik * nix klasik di sekitar jawaban utamanya.foo.tds.zip
berupa formulir. Ritsleting ini bergabung menjadi pohon TEXMF, yang sangat nyaman. Tetapi jika Anda ingin menghapus paket seperti itu Anda dihadapkan dengan masalah yang saya jelaskan.Jawaban:
Jawaban jjlin adalah caranya. Saya hanya ingin menambahkan beberapa pilihan untuk direktori:
Hapus semua file yang diekstraksi , tidak ada direktori :
Hapus file yang diekstrak dan direktori kosong saja
Tanpa opsi,
rmdir
hanya menghapus direktori kosong, itu akan meninggalkan file dan folder tidak kosong sendiri sehingga Anda dapat menjalankannya dengan aman*
.Hapus semua yang diekstraksi, tetapi minta konfirmasi sebelum setiap penghapusan:
The
-i
bendera akan menyebabkanrm
untuk meminta sebelum setiap penghapusan, Anda dapat memilih Ya atau TidakHapus semua yang diekstrak, termasuk direktori:
sumber
find
:find * -depth -type d -exec rmdir {} +
dan abaikan semuaDirectory not empty
pesan. Mungkin legal untuk mempersingkat inifind * -type d -delete
sebagai-delete
opsi aktif-depth
tetapi saya belum memverifikasi bahwa-delete
tidak akan menghapus direktori tidak kosong.find: cannot delete './foo': Directory not empty
Anda dapat menggunakan
unzip -lqq <filename.zip>
daftar isi file zip; ini akan mencakup beberapa info asing yang perlu Anda filter. Inilah perintah yang berfungsi untuk saya:The
awk
ekstrak perintah hanya nama-nama file dan direktori. Kemudian hasilnya diteruskan kexargs
untuk menghapus semuanya. Saya menyarankan untuk melakukan run-run dari perintah (yaitu, dengan menghilangkanxargs rm -rf
bagian) terlebih dahulu untuk memastikan hasilnya benar.Perintah di atas akan memiliki masalah berurusan dengan jalur yang memiliki spasi putih. Versi (lebih rumit) ini harus memperbaikinya:
sumber
unzip -lqq
daftar juga direktori yang ada di zip. Untuk saat ini, saya akan membiarkan semua direktori sendirian. Bagaimana menghapus semua direktori kosong di pohon mungkin menjadi pertanyaan lanjutan.grep -v '/$'
ke dalam pipeline untuk melewati penghapusan direktori (yang semuanya memiliki garis miring, AFAICT).awk
, karena mencetak hanya $ 4 tidak akan mencetak path lengkap.-r
opsi rm: yang sepertinya meminta masalah, terutama ketika dikombinasikan dengan-f
opsi. Saya tidak akan menggunakan-f
opsi sama sekali dalam skenario ini.grep -v '/$'
hanya akan menghilangkan entri direktori dalam file ZIP. Mereka masih akan memasukkan entri yang merupakan file biasa dalam file ZIP tetapi merupakan direktori yang sudah ada sebelumnya di folder target. Karena alasan ini, akan lebih bijaksana untuk menghilangkannya-r
Dengan sakelar
-Z1
, unzip akan mencantumkan tepat satu file per baris (dan bukan yang lain).Dengan cara ini, Anda bisa menggunakannya
untuk menghapus semua file yang diekstrak dari file zip.
Perintah
akan menghapus direktori juga, tetapi Anda harus berhati-hati. Jika direktori sudah ada sebelum mengekstraksi file zip, semua file yang sudah ada di direktori tersebut akan dihapus juga.
Jika Anda akan mengekstrak kembali file zip, ada pendekatan lain yang dijamin untuk menangani nama file yang aneh.
Pertama-tama ekstrak file zip tempat Anda semula dimaksudkan untuk mengekstraknya:
Sekarang, ubah ke direktori tempat Anda mengekstrak file secara tidak sengaja dan jalankan perintah berikut:
-type f
hanya menemukan file (tidak ada direktori).%P\0
adalah path relatif (tanpaelsewhere/
), diikuti oleh karakter nol.-0
membuat xargs memisahkan garis dengan karakter nol. Ini lebih dapat diandalkan, karena secara teori - nama file dapat berisi karakter baris baru.Untuk menangani direktori sisa, Anda dapat menjalankan perintah:
-type d
hanya menemukan direktori.-exec rmdir -p {} \;
dijalankanrmdir -p {}
untuk setiap direktori yang telah ditemukan.{}
adalah direktori yang telah ditemukan, dan-p
switch membuat rmdir juga menghapus direktori induknya yang kosong.2> /dev/null
menekan pesan kesalahan yang akan muncul dari upaya untuk menghapus direktori yang tidak kosong atau yang sebelumnya dihapus.Halaman manual terkait:
sumber
zipinfo
halaman manual.Berikut ini adalah solusi (saya pikir) yang lebih mudah dan lebih aman
Apa yang dilakukan ini: Perintah unzip backquoted akan menghasilkan daftar apa yang ada di file asli Anda.
zip -m kemudian akan menggunakan daftar itu untuk menambahkan add masing-masing ke getmeoutofhere.zip dan menghapusnya dari direktori asli (jadi secara teoritis itu harus indent ke myoriginalfile.zip.
Kelemahannya adalah bahwa unzip -lqq akan menghasilkan beberapa teks tambahan, tanggal, waktu, filesize, dll. Ini akan menyebabkan zip -m menghasilkan pesan kesalahan tetapi ini seharusnya tidak mempengaruhi (kecuali Anda memiliki kasus yang tidak mungkin dari file dengan yang sama nama).
Harap dicatat bahwa ini tidak akan menghapus direktori yang dibuat selama unzip asli.
sumber
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.
Ini akan menemukan beberapa direktori juga, tetapi
rm
akan membiarkannya sendirian. Mereka dapat ditangani di babak kedua: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: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:Kemudian gabungkan semuanya menjadi garis besar:
Sekarang masukkan
rm -rf
di depannya:Jalankan baris di bawah kursor sebagai perintah shell:
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.
sumber