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?

John mangual
la source
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 -@
slhck
la source
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
sancho.s Réintègre Monica
la source