Cara zip daftar file di Linux

17

Saya memiliki banyak file yang perlu saya zip ke satu direktori. Saya tidak ingin zip semua file dalam direktori, tetapi hanya yang cocok dengan permintaan tertentu.

aku melakukannya

grep abc file-* > out.txt 

untuk membuat file dengan semua instance "abc" di setiap file. Saya perlu file itu sendiri. Bagaimana saya bisa memberitahu bash untuk hanya meng-zip file-file itu?

John Mangual
sumber
Wildcard tidak berfungsi? Mengapa? Jika saya bisa bertanya ...
jherran
@ jherran Saya tidak ingin zip semua file dalam direktori, hanya yang cocok dengan permintaan tertentu. Saya lakukan grep abc file-* > out.txtuntuk membuat file dengan semua contoh "abc" di setiap file. Saya perlu file itu sendiri.
john mangual
Apa yang dimaksud @jherran adalah zip ZipFile.zip file-*, yang merupakan cara yang jelas untuk melakukannya. Anda akan memerlukan file perantara hanya jika Anda menggunakan kompleks findatau gabungan daftar file dari pencarian yang berbeda.
AFH

Jawaban:

31

Sangat sederhana:

zip archive -@ < out.txt

Yaitu, jika out.txtfile Anda mengandung satu nama file per baris. Ini akan menambahkan semua file dari out.txtsatu arsip yang disebut archive.zip.

The -@merek pilihan zipmembaca dari STDIN.

Jika Anda ingin melewatkan membuat out.txtfile sementara , Anda dapat menggunakan grepkemampuan untuk mencetak nama file juga. -rmemungkinkan pencarian berulang (mungkin tidak diperlukan dalam kasus Anda) dan -lhanya mencetak nama file:

grep -rl "abc" file-* | zip archive -@
slhck
sumber
Bekerja dengan baik, kecuali saya punya file daftar di mana ada spasi dalam nama file. Saya mencoba keduanya melarikan diri mereka dengan `` dan tidak melarikan diri mereka, sekali dalam tanda kutip dan sekali tanpa tanda kutip di sekitar nama file (satu baris - satu nama file). Sejauh ini tidak ada yang berhasil.
Thomas W.
2
Saya membuatnya bekerja dengan `lolos` spasi dan tidak ada tanda kutip dalam file dan berikut ini:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.
jika Anda ingin zip archive.zip $(ls common_name*)
menyalin
@ chepe263 Ini rusak jika file memiliki spasi di jalurnya. Biasanya tidak disarankan untuk mem-parsing output.
slhck
Bagi siapa pun di mac yang berada di sini berkat pengindeksan mesin pencari, -@sintaks opsi berfungsi dengan baik pada 10,16, meskipun halaman manual masih mencakup bahasa tentangnot on MacOS
Aidan Miles
0

Alternatif untuk jawaban yang diterima, dari sini :

cat out.txt | zip -@ zipfile.zip
cat out.txt | zip -@ - > zipfile.zip
zip zipfile.zip $(cat out.txt) -r
zip zipfile.zip -r . -i@out.txt
sancho.s Reinstate Monica
sumber