Perdona questa domanda basilare, ma non sono riuscito a trovare una risposta diretta o un semplice esempio sullo scambio di stack.
Diciamo che ho una cartella di file che vorrei comprimere in un file zip che posso condividere con i miei terribili amici di Windows (altrimenti userei tar
e finirò con esso). Sembra così:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
Supponendo di aver zip
installato:
sudo apt-get install zip
Vedo man zip
che mi consente di utilizzare un elenco di file:
- @ elenchi di file. Se un elenco di file viene specificato come - @ [Non su MacOS], zip prende l'elenco dei file di input dall'input standard anziché dalla riga di comando. Per esempio,
zip -@ foo
Quindi ho creato zip.lst
che assomiglia a questo:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
E ora ho provato:
zip -@ zip.lst
Ma non ha fatto altro che creare una riga vuota sulla console. E posso continuare a spingere Entere continua a creare più righe vuote senza eseguire il comando. Dopo alcune ricerche, mi sono reso conto che avevo bisogno di terminare l'input premendo Ctrl+D
Ma ora ho questo errore:
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)
Che cosa!? In che modo il mio semplice elenco non è una "struttura di file valida"? Torna al manuale per ulteriori informazioni e guardo più da vicino:
Se un elenco di file è specificato come - @ ...
Quindi lo provo senza -@
, e questo almeno lo elabora immediatamente senza dover premere Ctrl+ Dma mi rimane lo stesso errore .
Fortunatamente, ho trovato un commento su una risposta a una domanda quasi non correlata che mi ha portato a rendermi conto che dovevo nominare esplicitamente il file zip. Questo errore è dovuto al fatto che, per impostazione predefinita, stava tentando di creare un file zip chiamato zip.lst
. Ma dato che questo è il nome del mio elenco, si potrebbe pensare che lo sovrascriverebbe semplicemente, ma no, in realtà stava cercando di aggiornarlo. E poiché l'elenco ovviamente non è un file zip, otteniamo l'errore di struttura del file non valido, e ora è chiaro il motivo per cui diceva "probabilmente non un file zip". Quindi ho provato:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Eureka! Vedo che il file zip è stato creato e la mia cartella ora contiene questo:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Ma aspetta prima di festeggiare, confermiamo prima il contenuto del file zip:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
No! Bene, in realtà ha senso dall'uso standard perché ha appena compresso il file di un elenco che gli ho dato. Alla fine ho provato di nuovo con -@
ma ho ottenuto lo stesso risultato.
Che cosa sto facendo di sbagliato?
A proposito, so che posso usare la GUI e farlo con il mio mouse, ma devo scriverlo, e in generale sono più veloce sulla CLI quando so cosa sto facendo.
ls
egrep
zip e di-@
, è possibile utilizzare gocce di shell per selezionare i file direttamente sulla linea per esempio comando zipzip files.zip file*
ozip images.zip *.jpg
. Inoltre, quando si utilizza un elenco di nomi di file da un file, è possibile utilizzare il reindirizzamento invece di invocare un processo cat separato,zip files.zip -@ < zip.lst