Comment compresser une liste de fichiers sous Linux


17

J'ai de nombreux fichiers à compresser dans un seul répertoire. Je ne veux pas compresser tous les fichiers du répertoire, mais seulement ceux correspondant à une certaine requête.

J'ai fait

grep abc file-* > out.txt 

pour créer un fichier avec toutes les instances de "abc" dans chaque fichier. J'ai besoin des fichiers eux-mêmes. Comment dire à bash de compresser uniquement ces fichiers?


Les caractères génériques ne fonctionnent pas? Pourquoi? Si je peux demander ...
jherran

@jherran Je ne veux pas compresser tous les fichiers du répertoire, seulement ceux correspondant à une certaine requête. J'ai fait grep abc file-* > out.txtun fichier avec toutes les instances de "abc" dans chaque fichier. J'ai besoin des fichiers eux-mêmes.
john mangual

Ce que signifie @jherran zip ZipFile.zip file-*, c'est la façon évidente de le faire. Vous auriez besoin d'un fichier intermédiaire uniquement si vous utilisiez un complexe findou une concaténation de listes de fichiers provenant de différentes recherches.
AFH

Réponses:


31

Très simple:

zip archive -@ < out.txt

Autrement dit, si votre out.txtfichier contient un nom de fichier par ligne. Il ajoutera tous les fichiers de out.txtà une archive appelée archive.zip.

L' -@option fait ziplire depuis STDIN.

Si vous souhaitez ignorer la création d'un out.txtfichier temporaire , vous pouvez également utiliser grepla capacité de pour imprimer les noms de fichiers. -ractive la recherche récursive (peut-être pas nécessaire dans votre cas) et -limprime uniquement les noms de fichiers:

grep -rl "abc" file-* | zip archive -@

Fonctionne bien, sauf que j'ai un fichier de liste où il y a des espaces dans les noms de fichiers. J'ai essayé à la fois de les échapper avec `` et de ne pas les échapper, une fois entre guillemets et une fois sans guillemets autour du nom de fichier (une ligne - un nom de fichier). Jusqu'à présent, rien n'a fonctionné.
Thomas W.

2
Je l'ai fait fonctionner avec des espaces `` échappés et sans guillemets dans le fichier et les éléments suivants:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.

si vous voulez compresser des fichiers avec des noms similaires, vous pouvez essayerzip archive.zip $(ls common_name*)
chepe263

@ chepe263 Cela se brise si les fichiers ont des espaces sur leur chemin. Il est généralement déconseillé d'analyser la sortie ls.
slhck

Pour toute autre personne sur un Mac qui s'est retrouvée ici grâce à l'indexation des moteurs de recherche, la -@syntaxe des options fonctionne not on MacOS
Aidan Miles

0

Alternatives à la réponse acceptée, d' ici :

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.