Pardonnez cette question la plus élémentaire, mais je n'ai pas pu trouver de réponse directe ou d'exemple simple sur l'échange de pile.
Disons que j'ai un dossier de fichiers que je voudrais compresser en un seul fichier zip que je peux partager avec mes terribles amis Windows (sinon je l'utiliserais tar
et j'en aurais fini). Cela ressemble à ceci:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
En supposant que j'ai zip
installé:
sudo apt-get install zip
Je vois man zip
que cela me permet d'utiliser une liste de fichiers:
- @ listes de fichiers. Si une liste de fichiers est spécifiée comme - @ [Pas sous MacOS], zip prend la liste des fichiers d'entrée à partir de l'entrée standard au lieu de la ligne de commande. Par exemple,
zip -@ foo
J'ai donc créé zip.lst
ce qui ressemble à ceci:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
Et maintenant j'ai essayé:
zip -@ zip.lst
Mais cela n'a rien fait d'autre que de créer une ligne vierge sur la console. Et je peux continuer à pousser Enteret ça continue de faire plus de lignes vides sans exécuter apparemment la commande. Après quelques recherches, j'ai réalisé que je devais terminer la saisie en appuyant sur Ctrl+D
Mais maintenant, je reçois cette erreur:
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)
Quoi!? Comment ma simple liste n'est-elle pas une "structure de fichier valide"? Retour au manuel pour plus d'informations, et je regarde de plus près:
Si une liste de fichiers est spécifiée comme - @ ...
Je l'essaie donc sans -@
, et cela au moins le traite tout de suite sans avoir à appuyer sur Ctrl+ Dmais je reste avec la même erreur .
Heureusement, j'ai trouvé un commentaire sur une réponse à une question presque sans rapport qui m'a amené à réaliser que je devais nommer explicitement le fichier zip. Cette erreur est due au fait que par défaut, il essayait de créer un fichier zip appelé zip.lst
. Mais comme c'est le nom de ma liste, on pourrait penser qu'elle la remplacerait simplement, mais non, elle essayait en fait de la mettre à jour. Et puisque la liste n'est évidemment pas un fichier zip, nous obtenons l'erreur de structure de fichier invalide, et maintenant il est clair pourquoi il a dit "probablement pas un fichier zip." Alors j'ai essayé:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Eureka! Je peux voir que le fichier zip a été créé et mon dossier contient maintenant ceci:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Mais attendez avant de célébrer, confirmons d'abord le contenu du fichier zip:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
Non! Eh bien, en fait, cela a du sens par rapport à l'utilisation standard, car il vient de compresser le fichier de liste que je lui ai donné. Finalement j'ai réessayé avec -@
mais j'ai obtenu le même résultat.
Qu'est-ce que je fais mal?
BTW, je sais que je peux utiliser l'interface graphique et le faire avec ma souris, mais j'ai besoin de script cela, et en général je suis plus rapide sur la CLI quand je sais ce que je fais.
ls
etgrep
et zip-@
, vous pouvez utiliser des globes shell pour sélectionner des fichiers directement sur la ligne de commande zip, par exemplezip files.zip file*
ouzip images.zip *.jpg
. De plus, lorsque vous utilisez une liste de noms de fichiers à partir d'un fichier, vous pouvez utiliser la redirection au lieu d'invoquer un processus cat distinct,zip files.zip -@ < zip.lst
find
au lieu dels
la commande la plus simple avec un niveau de compression maximum
la source