Maafkan pertanyaan paling mendasar ini, tetapi saya tidak dapat menemukan jawaban langsung atau contoh sederhana tentang pertukaran tumpukan.
Katakanlah saya memiliki folder file yang ingin saya kompres menjadi satu file zip yang dapat saya bagikan dengan teman-teman Windows saya yang mengerikan (jika tidak, saya hanya akan menggunakan tar
dan selesai dengan itu). Ini terlihat seperti ini:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
Dengan asumsi saya telah zip
menginstal:
sudo apt-get install zip
Saya melihat dari man zip
itu memungkinkan saya untuk menggunakan daftar file:
- @ daftar file. Jika daftar file ditentukan sebagai - @ [Bukan pada MacOS], zip akan mengambil daftar file input dari input standar alih-alih dari baris perintah. Sebagai contoh,
zip -@ foo
Jadi saya buat zip.lst
yang terlihat seperti ini:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
Dan sekarang saya mencoba:
zip -@ zip.lst
Tapi itu tidak melakukan apa pun kecuali membuat garis kosong di konsol. Dan saya bisa terus mendorongEnter dan terus membuat lebih banyak baris kosong tanpa tampaknya menjalankan perintah. Setelah beberapa pencarian, saya menyadari bahwa saya perlu menghentikan input dengan menekan Ctrl+D
Tapi sekarang saya mendapatkan kesalahan ini:
zip warning: missing end signature--probably not a zip file (did you
zip warning: remember to use binary mode when you transferred it?)
zip warning: (if you are trying to read a damaged archive try -F)
zip error: Zip file structure invalid (zip.lst)
Apa!? Bagaimana daftar sederhana saya bukan "struktur file yang valid"? Kembali ke manual untuk informasi lebih lanjut, dan saya melihat lebih dekat:
Jika daftar file ditentukan sebagai - @ ...
Jadi saya mencobanya tanpa -@
, dan setidaknya memprosesnya segera tanpa harus menekan Ctrl+ Dtetapi saya pergi dengan kesalahan yang sama .
Untungnya, saya menemukan komentar pada jawaban untuk pertanyaan yang hampir tidak berhubungan yang membuat saya menyadari bahwa saya perlu secara eksplisit memberi nama file zip. Kesalahan ini karena secara default mencoba membuat file zip bernama zip.lst
. Tetapi karena itulah nama daftar saya, orang mungkin berpikir bahwa itu hanya akan menimpanya, tetapi tidak, itu sebenarnya mencoba memperbaruinya. Dan karena daftar itu jelas bukan file zip, kami mendapatkan kesalahan struktur file yang tidak valid, dan sekarang jelas mengapa dikatakan "mungkin bukan file zip." Jadi saya mencoba:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Eureka! Saya dapat melihat file zip dibuat dan folder saya sekarang berisi ini:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Tapi tunggu dulu sebelum kita merayakannya, mari kita konfirmasi dulu isi file zip:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
Tidak!Yah, sebenarnya itu masuk akal dari penggunaan standar karena hanya zip file satu daftar yang saya berikan. Akhirnya saya mencoba lagi dengan -@
tetapi mendapat hasil yang sama.
Apa yang saya lakukan salah?
BTW, saya tahu saya bisa menggunakan GUI dan melakukannya dengan mouse saya, tetapi saya perlu menulis skrip ini, dan secara umum saya lebih cepat menggunakan CLI ketika saya tahu apa yang saya lakukan.
ls
dangrep
dan zip-@
, Anda dapat menggunakan shell shell untuk memilih file secara langsung pada baris perintah zip misalnyazip files.zip file*
atauzip images.zip *.jpg
. Juga, saat menggunakan daftar nama file dari suatu file, Anda dapat menggunakan pengalihan alih-alih memanggil proses kucing yang terpisah,zip files.zip -@ < zip.lst