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.